Pagini recente » Cod sursa (job #2488355) | Cod sursa (job #127599) | Cod sursa (job #2405766) | Cod sursa (job #1650418) | Cod sursa (job #1762562)
#include <cstdio>
using namespace std;
int const N = 100001; //number of nodes
int const M = 1000001; //number of edges
int nodes[M], next[M], last[N], nr;
int q[N], cost[N];
bool visited[N];
void addEdge(int x, int y)
{
nodes[++nr] = y;
next[nr] = last[x];
last[x] = nr;
}
void printEdge(int p)
{
printf("%d -> ",p);
p = last[p];
while(p != 0)
{
printf("%d ",nodes[p]);
p = next[p];
}
printf("\n");
}
void bfs(int p)
{
int start = 1, finish = 1, pos, x;
q[1] = p;
visited[p] = true;
cost[p] = 0;
while(start <= finish)
{
p = q[start++];
pos = last[p];
while(pos != 0)
{
x = nodes[pos];
if(!visited[x] && cost[x] == 0)
{
cost[x] = cost[p] + 1;
visited[x] = true;
q[++finish] = x;
}
pos = next[pos];
}
}
}
void dfs(int p)
{
int pos,x;
visited[p] = true;
pos = last[p];
while(pos != 0)
{
x = nodes[pos];
if(!visited[x])
{
cost[x] = cost[p] + 1;
dfs(x);
}
pos = next[pos];
}
}
int main()
{
int i,n,m,p,x,y;
freopen("bfs.in","r",stdin);
freopen("bfs.out","w",stdout);
scanf("%d %d %d",&n,&m,&p);
for(i = 1; i <= m; i++)
{
scanf("%d %d",&x,&y);
addEdge(x,y);
}
bfs(p);
//dfs(p);
for(i = 1; i <= n; i++)
{
if(!visited[i]) printf("-1 ");
else printf("%d ",cost[i]);
}
return 0;
}