#include #define MAX_N 102400 // massimo numero di stazioni che potrebbero capitarmi #define MAX_DEG 1024 // massimo grado per nodo (deciso a priori) using namespace std; int Adiacenti[MAX_N][MAX_DEG]; // lista di adiacenza, int nAdj[MAX_N]; // con vettore dei gradi per ogni nodo int Visitato[MAX_N]; // vettore che mi ricorda cosa ho gia' visitato (e la parita') int N, bipartito = 1; // "bipartito" mi dice se i nodi sono divisibili in pari/disp o no int ok, no; // numero di stazioni in cui apro le porte, e in cui passo senza aprirle void visitaparidisp(int v, int paridisp) // visita che segna nodi pari e dispari, e controlla se { // esistono archi tra nodi con stessa parita': // in tal caso potro' raggiungere tutto. if (paridisp) ok++; // mi conto come nodo ok=pari o no=dispari, else no++; Visitato[v] = 1+paridisp; // mi visito (segnando 1 se disp, 2 se pari) for (int i=0; i> N >> M; for (int i=0; i> a >> b; a--, b--; Adiacenti[a][nAdj[a]++] = b; // aggiungo b in fondo alla lista di adiacenti di a Adiacenti[b][nAdj[b]++] = a; // e viceversa } visitaparidisp(0,1); // gli faccio visitare il grafo per dividere i nodi in pari/disp if (bipartito) cout << ok << endl; // se e' divisibile in pari/disp, vanno bene solo i pari else cout << ok+no << endl; // se no vanno bene anche i dispari return 0; }