Aiuto con interruttori

Non ho mai trattato i grafi, ed ho provato a risolvere così il problema degli interruttori:

#include <bits/stdc++.h>
using namespace std;
void solve(int t) {
    int N, A, B;
    cin >> N >> A >> B;
    int D[N];
    bool b[N];
    memset(D, N, sizeof(D));
    memset(b, false, sizeof(b));
    vector<int> Z(A), X(B), Y(B);
    vector<vector<int>> adiacenza(N);
    queue<int >q;
    for (int i = 0; i < A; i++)
        cin >> Z[i];
    for (int i = 0; i < B; i++)
        cin >> X[i] >> Y[i];
    int idx=0;
    for(int i=0;i<B;i++){
    	adiacenza[X[i]].push_back(Y[i]);
    	adiacenza[Y[i]].push_back(X[i]);
	}
	for (int i=0;i<N;i++)
	    D[i]=N;
	for (int j : Z)
	{
	    q.push(j);
	    D[j]=0;
	    b[j]=true;
	    while (!q.empty()) 
	    {
            int v = q.front();
            q.pop();
	        for (int w : adiacenza[v])
	        {
	            if (!b[w])
	            {
	                b[w]=true;
	                D[w]=D[v]+1;
	                q.push(w);
	            }
	        }
	    }
	}
	int num = -1;
    for (int i = 0; i < N; ++i) {
        if (num < D[i]) 
        {
            num = D[i];
            idx = i;
        }
    }
    cout << "Case #" << t << ": " << idx << " " << num+1 << "\n";
}

int main() 
{
    int T;
    cin >> T;
    for (int t = 1; t <= T; t++) 
        solve(t);
    return 0;
}

Non capisco dove sia il problema, e soprattutto come potrei farlo diversamente… qualcuno riuscirebbe ad aiutarmi?

In particolare, dei casi di esempio del problema sbaglia a risolvere il secondo:
ad input
6 3 7
0
4
1
0 1
3 2
1 3
0 3
3 4
4 5
2 5
restituisce
Case #2: 5 4
quando in realtà dovrebbe restituire
Case #2: 2 3
non riesco a capirne il motivo

Stai sovrascrivendo le distanza ogni volta che consideri un nuovo interruttore da uno.
In ogni caso, se il proprio programma sbaglia un caso d’esempio spesso il bug è facile da trovare con le normali tecniche di debug (i.e. controllare i valori delle variabili durante l’esecuzione)

Intendi per caso dove ho scritto D[j]=0 ?