Cod sursa(job #536584)

Utilizator SheepBOYFelix Liviu SheepBOY Data 18 februarie 2011 20:25:21
Problema BFS - Parcurgere in latime Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<stdlib.h>

struct GF{
int a,b;
};
GF dst[10000001];
int cnt[100000];
int n,m,s;

int CMP(const void *a,const void *b)
{
	GF x,y;
	x=*(GF *)a;
	y=*(GF *)b;
	if(x.a<y.a)
		return -1;
	if(x.a>y.a)
		return 1;
	if(x.a==y.a)
	{
		if(x.b<y.b)
			return -1;
		if(x.b>y.b)
			return 1;
	}
	return 0;
}
int BINsrc(int val)
{
	int mid,st,dr;
	st=0;
	dr=m;
	while(st<dr)
	{
		mid=((st+dr)>>1);
		if(val<=dst[mid].a)
			dr=mid;
		else
			st=mid+1;
	}
	if(dst[dr].a==val)
		return dr;
	else
		return -1;
}
void BFS(int s,int dist)
{
	//i'll make it DFS cuz i'm tired this evening
	int u=BINsrc(s),p;
	
	cnt[s]=dist;
	while(dst[u].a==s && u<m)
	{
		if(cnt[dst[u].b]<0)
			BFS(dst[u].b,dist+1);
		++u;
	}
}
int main()
{
	int i;
	
	
	freopen("bfs.in","r",stdin);
	freopen("bfs.out","w",stdout);
	scanf("%d%d%d",&n,&m,&s);
	
	for(i=0;i<m;++i)
	{
		if(i<=n)
			cnt[i]=-1;
		scanf("%d%d",&dst[i].a,&dst[i].b);
		if(dst[i].a==dst[i].b)
		{
			--i;
			--m;
		}
	}
	
	qsort(dst,m,sizeof(dst[0]),CMP);
	
	BFS(s,0);
	
	for(i=1;i<=n;++i)
		printf("%d ",cnt[i]);
	return 0;
}