Pagini recente » Cod sursa (job #976543) | Statistici Adriana Mihnea (addamhhn) | Istoria paginii utilizator/alexandracucuruzan | Rating Mihai Cristian (bucilamihai.iWNL) | Cod sursa (job #1869884)
#include <cstdio>
///Coada circulara
#define MAX 1000000
using namespace std;
FILE *f, *g;
int k;
int urm[1000001];
int nod[1000001];
int lst[100001];
int cost[100001];
bool viz[100001];
int n, m, st;
int c[1000001];
void add(int a, int b)
{
k ++;
nod[k] = b;
urm[k] = lst[a];
lst[a] = k;
}
void readFile()
{
f = fopen("bfs.in", "r");
fscanf(f, "%d%d%d", &n, &m, &st);
int i;
int a, b;
for(i = 1; i <= m; i ++)
{
fscanf(f, "%d%d", &a, &b);
add(a, b);
}
}
void bfs(int start)
{
int st = 1;
int dr = 0;
c[++ dr] = start;
cost[start] = 0;
int cr, p;
while(st <= dr)
{
cr = c[st ++];
///Coada circulara
if(st == MAX + 1)
st = 1;
p = lst[cr];
viz[cr] = 1;
while(p != 0)
{
if(viz[nod[p]] == 0)
{
c[++ dr] = nod[p];
cost[nod[p]] = cost[cr] + 1;
///Coada circulara
if(dr == MAX)
dr = 1;
}
p = urm[p];
}
}
}
void solve()
{
bfs(st);
}
void printFile()
{
g = fopen("bfs.out", "w");
int i;
for(i = 1; i <= n; i ++)
{
if(i != st && cost[i] == 0)
fprintf(g, "-1 ");
else
fprintf(g, "%d ", cost[i]);
}
fprintf(g, "\n");
fclose(f);
}
int main()
{
readFile();
solve();
printFile();
return 0;
}