Cod sursa(job #324866)

Utilizator irene_mFMI Irina Iancu irene_m Data 17 iunie 2009 18:10:09
Problema BFS - Parcurgere in latime Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream.h>
#define MaxN 100009
#define MaxM 1000009

int n,m,S,T[2][2*MaxM],a[MaxN],ok[MaxN],sw,tr[MaxN];

void add(int x,int y,int &st)
{
	T[0][st]=y;
	T[1][st]=a[x];
	a[x]=st;
	st++;
}

void cit()
{
	int i,st=1,x,y;
	ifstream fin("bfs.in");
	fin>>n>>m>>S;
	for(i=1;i<=m;i++)
	{
		fin>>x>>y;
		add(x,y,st);
	}
	fin.close();
}

void BF(int nod,int x)
{
	int p,c[MaxN],st=1,dr=1;
	ok[nod]=1;
	c[st]=nod;
	tr[nod]=0;
	while(st<=dr && !sw)
	{
		p=a[c[st]];
		while(p && !sw)
		{
			if(!ok[T[0][p]] || T[0][p]==x)
			{
				dr++;
				c[dr]=T[0][p];
				ok[T[0][p]]=1;
				tr[T[0][p]]=c[st];
				if(T[0][p]==x)
					sw=1;
			}
			p=T[1][p];
		}
		st++;
	}
}
	
	
int main()
{
	cit();
	ofstream fout("bfs.out");
	for(int i=1;i<=n;i++)
	{
		sw=0;
		BF(S,i);
		if(!sw)
			fout<<"-1 ";
		else
			if(i==S)
				fout<<"0 ";
			else
			{
				int p=tr[i],nr=0;
				while(p)
				{
					p=tr[p];
					nr++;
				}
				fout<<nr<<' ';
				for(int j=1;j<=n;j++)
					tr[j]=0;
			}
			
		for(int j=1;j<=n;j++)
			ok[j]=0;
	}

	fout.close();
	return 0;
}