#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <ctime>
#include <cmath>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <cstring>
#include <iterator>
#include <fstream>
using namespace std;

#define pb push_back
#define rs resize
#define mp make_pair
#define inf 1e9
#define pi 3.1415926535897932384626433832795
#define sz(a) (int)(a).size()
#define Sort(a) sort((a).begin(), (a).end())
#define Reverse(a) reverse((a).begin(), (a).end())
#define sf scanf
#define pf printf
#define ms(a, x) memset((a), (x), sizeof(a))
#pragma comment(linker, "/STACK:200000000")
typedef vector <int> vi;
typedef vector <vi> vvi;
typedef vector <vvi> vvvi;
typedef vector <vvvi> vvvvi;
typedef vector <bool> vb;
typedef vector <vb> vvb;
typedef vector <vvb> vvvb;
typedef vector <vvvb> vvvvb;
typedef long long ll;
typedef vector <ll> vl;
typedef vector <vl> vvl;
typedef vector <vvl> vvvl;
typedef vector <vvvl> vvvvl;
typedef pair <int, int> ii;
typedef vector <ii> vii;
typedef vector <vii> vvii;
typedef pair <int, ll> il;
typedef vector <il> vil;
typedef vector <vil> vvil;
typedef pair <ll, int> li;
typedef vector <li> vli;
typedef vector <vli> vvli;
typedef set <int> si;
typedef set <li> sli;
typedef set <il> sil;
typedef vector <string> vs;
typedef vector <vs> vvs;
typedef vector <vvs> vvvs;
typedef map <string, int> msi;
typedef map <char, int> mci;
typedef pair <ll, ll> pll;

struct str {
    ll x, take, untake;

    str() {}
    str(ll x, ll take, ll untake) : x(x), take(take), untake(untake) {}
    bool operator <(const str &other) const {
        return x < other.x;
    }
};

void dfs(int v, vvi &g, vl &x, vl &ansx, vl &y, vl &ansy) {
    if (sz(g[v]) == 0) {
        ansx[v] = x[v] = 1;
        ansy[v] = y[v] = 2;
        return;
    }
    for (int i = 0; i < sz(g[v]); ++i) {
        dfs(g[v][i], g, x, ansx, y, ansy);
    }
    vector <str> a;
    for (int i = 0; i < sz(g[v]); ++i) {
        a.pb(str(x[g[v][i]], ansx[g[v][i]], ansy[g[v][i]]));
    }
    Sort(a);
    vector <str> b(1, a[0]);
    for (int i = 1; i < sz(a); ++i) {
        if (a[i].x != a[i - 1].x) {
            b.pb(a[i]);
        } else {
            b.back().take += a[i].take;
            b.back().untake += a[i].untake;
        }
    }
    ll take = 0, untake = 0;
    for (int i = 0; i < sz(b); ++i) {
        take += b[i].take;
        untake += b[i].untake;
    }
    ll X = 0, AX = (ll)1e12, Y = 0, AY = (ll)1e12;
    for (int i = 0; i < sz(b); ++i) {
        ll r = take - b[i].take + b[i].untake + b[i].x;
        if (r < AX) {
            Y = X;
            AY = AX;
            X = b[i].x;
            AX = r;
        }
        else if (r < AY) {
            Y = b[i].x;
            AY = r;
        }
    }
    int pos = 0;
    while (pos < sz(b) && b[pos].x == pos + 1)
        ++pos;
    if (take + pos + 1 < AX) {
        AY = AX;
        Y = X;
        AX = take + pos + 1;
        X = pos + 1;
    }
    else if (take + pos + 1 < AY) {
        AY = take + pos + 1;
        Y = pos + 1;
    }
    x[v] = X;
    y[v] = Y;
    ansx[v] = AX;
    ansy[v] = AY;
    return;
}

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int T;
    cin >> T;
    for (int test = 1; test <= T; ++test) {
        int n;
        cin >> n;
        vvi g(n);
        for (int i = 0; i < n; ++i) {
            int x;
            cin >> x;
            --x;
            if (x >= 0)
                g[x].pb(i);
        }
        vl x(n), y(n), ansx(n), ansy(n);
        dfs(0, g, x, ansx, y, ansy);
        cout << "Case #" << test << ": " << ansx[0] << endl;
    }
}