Pagini recente » Cod sursa (job #377727) | Cod sursa (job #396671) | Cod sursa (job #2348642) | Cod sursa (job #838938) | Cod sursa (job #633341)
Cod sursa(job #633341)
//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;
}