Cod sursa(job #633341)

Utilizator dany123Florea Daniel dany123 Data 13 noiembrie 2011 16:41:12
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
//DFS nerecursiv cu STL si retinere indici 13.11.2011
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int n,m,viz[100001],index[100001];//index[3]=4 =>pt nodul 3 s-a parcurs deja pana la vecinul 4
vector <int> v[100001];

void citire()
{
	ifstream fin("dfs.in");
	fin>>n>>m;
	int a,b;
	for (int i=0;i<m;i++)
	{
		fin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	fin.close();
}
int are_vecini_nevizitati(int nod)
{
	for (;index[nod]<v[nod].size();index[nod]++)
		if (viz[v[nod][ index[nod] ]]==0) 
			return v[nod][ index[nod] ]; //returnez vecinul nevizitat
	return 0; //SAU returnez 0
}
void dfs_nerecursiv (int nod)
{
	vector <int> stiva;
	stiva.push_back(nod);//punem nodul initial in stiva
	do
	{
		//cout<<stiva.back()<<' '; //****
		viz[stiva.back()]=1;
		int vecin;
		if ( vecin= are_vecini_nevizitati(stiva.back()) )//daca are vecini nevizitati
		{
			stiva.push_back(vecin); //il punem in stiva 
		}
		else 
		{
			viz[stiva.back()]=1; //il marcam ca vizitat si repetam
			stiva.pop_back(); //daca nu mai are vecini il scoatem
		}
	}while (!stiva.empty());
}
int main ()
{
	citire();
	int nr=0;
	
	for (int i=1;i<=n;i++)
	{
		if (viz[i]==0)
		{
			dfs_nerecursiv(i);
			nr++;
		}
	}
	
	ofstream fout("dfs.out");
	fout<<nr;
	fout.close();
	
	return 0;
}