Cod sursa(job #172219)

Utilizator stefysStefan stefys Data 5 aprilie 2008 22:53:13
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
//Acest cod a fost pus sa fie testat ca sa vada tehstick, k ? xD

#include <cstdio>
#include <bitset>
#include <algorithm>
#include <utility>
#include <vector>
#include <exception>
#include <stdexcept>

using namespace std;

const int MAX_NR_PORTURI = 100;

int main (void)
{
	freopen("dfs.in", "r", stdin);
	freopen("dfs.out", "w+", stdout);
	
	int nrPorturi;
	vector< pair<int,int> > muchii;

	
	int nrMuchii; // never used.
	scanf("%d %d", &nrPorturi, &nrMuchii);
	int port1,port2;
	while ( scanf("%d %d", &port1, &port2) == 2) {
		if (port1>port2) swap(port1,port2);
		muchii.push_back( make_pair(port1-1, port2-1) );
	}
	
	vector<int> parcurgere_laterala;
	vector<int> clubApartenent(nrPorturi);
	
	parcurgere_laterala.push_back(0);
	int pozNodInParcurgere, clubCurent=0;
	
	do {
		++clubCurent;
		pozNodInParcurgere = 0;
		while (pozNodInParcurgere < parcurgere_laterala.size()) {
			int nod = parcurgere_laterala[pozNodInParcurgere];
			/* NOTA IMPORTANTA:
			DACA PUNEAM const int &nod = blabla
			NU AR FI FUNCTIONAT, DEOARECE REFERINTA S-AR FI INVALIDAT LA .push_back()
			*/
			clubApartenent[nod] = clubCurent;
			for (vector<pair<int,int> >::const_iterator iter = muchii.begin(); iter != muchii.end();
					++iter)
				if (iter->first == nod || iter->second == nod) {

					int nodAdiacent = iter->first==nod ? iter->second : iter->first;
					if (find(parcurgere_laterala.begin(), parcurgere_laterala.end(), nodAdiacent) == 
								parcurgere_laterala.end())
								parcurgere_laterala.push_back(nodAdiacent);
				}
			++pozNodInParcurgere;
		}
		parcurgere_laterala.clear();
		int nodNeparcurs;
		for (nodNeparcurs=1; nodNeparcurs<nrPorturi && clubApartenent[nodNeparcurs]; ++nodNeparcurs);
		if (nodNeparcurs < nrPorturi) parcurgere_laterala.push_back(nodNeparcurs);
		else break;
	} while (1);
	
	printf("%d\n", clubCurent);
	for (int nrClub=1; nrClub <= clubCurent; ++nrClub) {
		for (int j=0; j<clubApartenent.size(); ++j)
			if (clubApartenent[j]==nrClub) printf("%d ", j+1);
		printf("\n");
	}
	return 0;
}