Ponti isole 10/100

un aiuto su ponti isole perchè ho 10/100

~~
#include
#include <stdlib.h>
#include
#include
using namespace std;
const int MAXN=10000;
const int MAXM=100000;
bool visitato[MAXN];
list adj[MAXN]; // array di lista
stack pila; int k;
//Esegue una visità in profondità
void visita (int nodo)
{ pila.push(nodo);
while (!pila.empty())
{ int corrente=pila.top();
pila.pop();
if (visitato[corrente]==false)
{ visitato[nodo]=true; k=k+1;
for (list :: iterator i=adj[corrente].begin(); i!=adj[corrente].end();i++)
pila.push(*i);
}
cout<<k;
}

}
int main()
{ freopen(“input.txt”,“r”,stdin);
freopen(“output.txt”,“w”,stdout);
int N,M;
cin>>N>>M;
for (int i=0;i<N; i++)
visitato[i]=false;
int da[M]; int a[M];
for (int i=0;i<M; i++)
{ cin>>da[i]>>a[i];
adj[a[i]].push_back(da[i]);
adj[da[i]].push_back(a[i]);

}
visita(0);
}

~~

Devi fare una funzione che visita i nodi adiacenti, a cui trasferisci un nodo di partenza, fai un contatore che conta quante volte richiami quella funzione per visitare tutti i nodi

Diciamo che ci sono alcune cose da rivedere:

  • Nella funzione visita()

    1. Penso sia una svista ma dove c’è scritto visitato[nodo]=true; dovrebbe essere visitato[corrente]=true;

    2. Non puoi mettere nella pila tutti i nodi collegati al nodo corrente ma solo alcuni che rispettano una certa condizione, altrimenti la maggior parte delle volte si crea un ciclo infinito.

    3. Ti faccio poi notare che ad ogni iterazione del while tu scrivi sul file di output il valore della variabile k, e finita l’esecuzione del codice avrai apparentemente un numero ma in realtà sono i diversi valori di k non spaziati che tu stampi

Infine per arrivare alla soluzione bisogna fare una piccola osservazione.
Per aiutarti ti lascio questo input:
6 3
0 1
2 3
4 5
che rappresenta il seguente grafo:

e l’output sarà:
2

1 Mi Piace