Cod sursa(job #391989)

Utilizator SheepBOYFelix Liviu SheepBOY Data 6 februarie 2010 16:47:23
Problema BFS - Parcurgere in latime Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
/*#include<stdio.h>
#include<stdlib.h>
int deg[100005],*vec[100005],q[1000005];
void BFS(int st)
{
	int u,p,j;
	u=0;
	p=1;
	deg[st]=0;
	q[0]=st;
	while(u<p)
	{
		for(j=1;j<vec[q[u]][0];++j)
		{
			if(!deg[vec[q[u]][j]]&&vec[q[u]][j]!=st)
			{
				
				q[p]=vec[q[u]][j];
				deg[q[p++]]=deg[q[u]]+1;
			}
		}
		++u;
	}
}
int main()
{	
	freopen("bfs.in","r",stdin);
	freopen("bfs.out","w",stdout);
	int n,m,s,ax1,ax2,i;
	scanf("%d%d%d",&n,&m,&s);
	for(i=0;i<m;++i)
	{
		scanf("%d%d",&ax1,&ax2);
		if(ax1!=ax2)
		++deg[ax1];
	}
	freopen("bfs.in","r",stdin);
	scanf("%d%d%d",&n,&m,&s);
	for(i=1;i<=m;++i)
	{
		scanf("%d%d",&ax1,&ax2);
		if(deg[ax1]>0)
		{
			//vec[ax1]=new int[deg[ax1]+1];
			vec[ax1]=(int *)malloc((deg[ax1]+1)*sizeof(int));
			vec[ax1][0]=1;
			vec[ax1][vec[ax1][0]++]=ax2;
			deg[ax1]=0;
		}
		else
			if(ax1!=ax2)
				vec[ax1][vec[ax1][0]++]=ax2;
	}
	BFS(s);
	for(i=1;i<=n;++i)
		if(deg[i]||(!deg[i]&&i==s))
			printf("%d ",deg[i]);
		else
			printf("-1 ");
	return 0;
}*/
#include<stdio.h>
#include<stdlib.h>
#define INF 1000010
struct Point{
int x,y;
};
Point Graf[INF];
int n,m,s,VF[INF],cost[INF],q[INF];
void lee(int s)
{
	int u,p,i,last;
	u=0;
	p=1;
	cost[s]=0;
	q[u]=s;
	while(u<p)
	{
		//merg pe vecinii nodului curent
		i=VF[q[u]];
		last=Graf[i].x;
		while(Graf[i].x==last)
		{
			if(Graf[i].x!=Graf[i].y&&Graf[i].y!=s)
			{
				if(cost[Graf[i].y]==INF)
				{
					q[p++]=Graf[i].y;
					cost[Graf[i].y]=cost[Graf[i].x]+1;
				}
			}
			++i;
		}
		++u;
	}
}
int cmp(const void *a,const void *b)
{
	Point u,i;
	u=*(Point *)a;
	i=*(Point *)b;
	if(u.x>i.x)
		return 1;
	if(u.x<i.x)
		return -1;
	if(u.x==i.x)
	{
		if(u.y>i.y)
			return 1;
		if(u.y<i.y)
			return -1;
		return 0;
	}
}
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)
	{
		scanf("%d%d",&Graf[i].x,&Graf[i].y);
		cost[i]=INF;
	}
	for(i=m;i<INF;++i)
		cost[i]=INF;
	qsort(Graf,m,sizeof(Graf[0]),cmp);
	int last=Graf[0].x;
	VF[Graf[0].x]=0;
	for(i=1;i<m;++i)
	{
		while(Graf[i].x==last)++i;
		VF[Graf[i].x]=i;
		last=Graf[i].x;
	}
	lee(s);
	for(i=1;i<=n;++i)
	{
		if(cost[i]==INF)
			printf("-1 ");
		else
			printf("%d ",cost[i]);
	}
	return 0;
}