Caccia agli interruttori - non va il primo testcase

sto provando a risolvere questo problema ma col mio codice il primo test case da 3 4 invece che 3 3 mentre gli altri 3 vanno e non riesco a capire perchè

questo è il mio codice:

#include <iostream>
#include <bits/stdc++.h>
#define MAXN 100000

using namespace std;

ifstream fin ("input.txt");
ofstream fout ("output.txt");

vector<int> adj[MAXN];
vector<int> visited(MAXN);
vector<int> singolo(MAXN);

long long giriMinimiPerLaLampadina=9999999; //i giri minori con la quale viene spenta la lampadina che sta venendo controllata dalla dfs
int giriMassimi=0; //i giri della lampadina che ci mette di più


void dfs(int x,int giriCorrenti)
{   //se non è stato visitato
    if(visited[x]==0)
    {
        //lo visita
        giriCorrenti++;
        visited[x]=1;
        //se non era singolo
        if(singolo[x]==0)
        {
            //controlla gli altri
            for(auto u:adj[x])
            {

            dfs(u,giriCorrenti);

            }
            //se era singolo
        }else{
            //guarda se ci ha messo meno giri rispetto alle altre strade prese
        if(giriCorrenti<giriMinimiPerLaLampadina)
        {
            giriMinimiPerLaLampadina=giriCorrenti;
        }
        }
     }

}

pair<int,int> svolgi()
{
        //input
    int N,A,B; //numero lampadine, numero interruttori singoli, numero interruttori doppi
    fin>>N>>A>>B;
    int lampadina1,lampadina2;
    int lampadinaVincente=-1;
    int giriLampadinaVincente=-1;

    for(int i=0;i<A;i++)
    {
        fin>>lampadina1;
        singolo[lampadina1]=1;
    }

    for(int i=0;i<B;i++)
    {

        fin>>lampadina1>>lampadina2;

        adj[lampadina1].push_back(lampadina2);

        adj[lampadina2].push_back(lampadina1);

    }
//fine input
    
    
    //per ogni lampadina
    for(int i=0;i<N;i++)
    {
        //azzera visited
      fill(visited.begin(),visited.end(), 0);

      //chiama dfs
        dfs(i,0);
        
        //controlla se questa lampadina ha il percorso più lungo rispetto alle altre provate
       if (giriMinimiPerLaLampadina>giriMassimi)
       {
           giriMassimi=giriMinimiPerLaLampadina;
           lampadinaVincente=i;
           giriLampadinaVincente=giriMassimi;
       }



       giriMinimiPerLaLampadina=9999999;



    }

    return make_pair(lampadinaVincente,giriLampadinaVincente);

}


int main()
{
    fill(visited.begin(),visited.end(), 0);
    int test;fin>>test;
    for(int t=1;t<=test;t++)
    {

        pair<int,int> coppia=svolgi();
        fout<<"Case #"<<t<<": "<<coppia.first<<" "<<coppia.second<<endl;

        fill(singolo.begin(),singolo.end(), 0);

        for(int i=0;i<100000;i++)
        {

              adj[i].clear();


        }
        giriMassimi=0;

    }
}

Ciao, il problema della tua soluzione è che quando vuoi trovare la distanza minima fra la lampadina corrente e una lampadina “singola”, ovvero che ha collegato un interruttore di tipo 1, stai utilizzando una visita in profondità o DFS, mentre questa non ti garantisce di trovare la distanza minima, ma solo di trovare una possibile distanza, ti consiglio quindi di provare con una visita in ampiezza o BFS.
Il fatto che in tutti i casi di esempio tranne nel primo dia la risposta corretta è solamente una coincidenza dovuta, nel secondo caso all’ordine in cui gli interruttori sono forniti in input, infatti scambiando gli interruttori 1 e 6 la tua soluzione produce una risposta errata, mentre negli altri due casi il grafo che viene a formarsi è una linea.

Detto questo, anche se sistemata questa soluzione impiega probabilmente abbastanza tempo ad eseguire perché rieffettuando la visita interamente per ogni lampadina ottieni una complessità di O(NB) che è un po’ troppo elevata considerati N,B \le 10^5. Essendo un problema della piattaforma terry, non è sempre necessario trovare la soluzione più veloce per avere il punteggio pieno, ma non sono sicuro che questa soluzione possa eseguire in un tempo ragionevole, infatti considerato che l’input è composto da 24 casi, di questi suppongo che almeno 7/8 (se non di più) abbiano effettivamente N molto grande, e quindi potrebbe impiegare molto tempo.
Per provare ad ottimizzare la tua soluzione:

  • Hint 1: Puoi notare che tu adesso stai cercando per ogni lampadina la strada più corta ad un interruttore di tipo 1, ma in realtà potresti fare il contrario e cercare per ogni interruttore di tipo 1 la distanza minima da ogni lampadina riducendo il numero di visite da N ad A, anche se questa soluzione è comunque troppo lenta in quanto A è potenzialmente grande quanto N.

  • Hint 2: Non ti interessano davvero tutti i risultati di ogni visita, ma solo il minimo per ogni lampadina.

  • Hint 3: Puoi eseguire una sola visita con più sorgenti, in particolare con una sorgente per ogni interruttore di tipo 1.

2 Mi Piace

grazie mille coi tuoi consigli sono riuscito a trovare una soluzione