Cod sursa(job #193124)

Utilizator stefysStefan stefys Data 2 iunie 2008 14:11:31
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <vector>
#include <cstdio>

int main (void)
{
	std::vector<std::vector<unsigned int> > graf;
	
	freopen("dfs.in", "r", stdin);
	freopen("dfs.out", "w+", stdout);
	
	unsigned int nrNoduri, nrMuchii, componente=0;
	scanf("%u %u\n", &nrNoduri, &nrMuchii);
	
	graf.resize(nrNoduri);
	for (unsigned int muchie=0; muchie<nrMuchii; ++muchie) {
		unsigned int src, dest;
		scanf("%u %u\n", &src, &dest);
		--src; --dest;
		graf[src].push_back(dest);
		graf[dest].push_back(src);
	}
	
	unsigned int *Q = new unsigned int[nrNoduri], *Q_push, *Q_pop;
	std::vector<char> used; used.resize(nrNoduri*10);
	unsigned int nod=0;
	do {
		Q_push = Q_pop = Q;
		*(Q_push++) = nod;
		used[nod] = 1;
		while (Q_push > Q_pop) {
			unsigned int crt = *(Q_pop++);
			printf(":: %u\n",crt); fflush(stdout);
			//used[crt]=1;
			for (std::vector<unsigned int>::const_iterator iter = graf[crt].begin();
					iter != graf[crt].end(); ++iter)
				if (!used[*iter]) {
					*(Q_push++) = *iter;
					used[crt] = 1;
					printf("push: %u\n", *iter); fflush(stdin);
				}
		}
		for (++nod; nod<nrNoduri && used[nod]; ++nod);
		++componente;
	} while (nod < nrNoduri);
	
	printf("%u\n", componente);
	
	delete [] Q;
	fclose(stdin);
	fclose(stdout);
	return 0;
}