Cod sursa(job #442449)

Utilizator APOCALYPTODragos APOCALYPTO Data 14 aprilie 2010 16:21:50
Problema Parcurgere DFS - componente conexe Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#define Nmax 100005
#define Mmax 200005
using namespace std;
struct lista{int inf; lista* urm;} *a[Nmax];
int nrvec[Nmax];
int main()
{
	fstream f("dfs.in",ios::in), g("dfs.out",ios::out);
	int n,m,viz[Nmax]={0},nrComp=1;
	lista *nou;
	f>>n>>m;
	int i,x,y,j;
	for(i=1;i<=m;i++)
	{
		f>>x>>y;
		nrvec[x]++; nrvec[y]++;
		nou=new lista;
		nou->inf=y;
		nou->urm=a[x];       //adaug pe y ca vecin lui x
		a[x]=nou;

		nou=new lista;
		nou->inf=x;         // adaug pe x va vecin lui y
		nou->urm=a[y];
		a[y]=nou;

	}
	lista *temp;

	int vf=1,c[Nmax],p,u; //coada pt bf
	int nr,max=-1;
	do{
		p=u=0;
		c[++u]=vf;  nr=1; //in componenta curenta avem un sg. nod
		viz[vf]=nrComp;
		while(p!=u)
		{
			vf=c[++p]; //extragere
			if(p>Nmax-2)
				p=0;
			temp=a[vf];
			for(i=1;i<=nrvec[vf];i++)
			{
				if(viz[temp->inf]==0)
				{
					c[++u]=temp->inf; if(u>Nmax-2) u=0;
					viz[temp->inf]=nrComp;
					nr++; //numar nodurile din componenta curenta

				}
				temp=temp->urm;
			}
		}
		if(nr>max)
			max=nr; //aleg nr maxim
		nrComp++;  //am terminat o componenta
		vf=0;
		for(i=1;i<=n;i++)  //caut un varf nevizitat
			if(viz[i]==0)
			{	vf=i;
				break;
			}
	}while(vf>0);

	g<<nrComp-1; //cerinta b)
	g.close();
	f.close();
	return 0;
}