Pagini recente » Cod sursa (job #38741) | Cod sursa (job #3153712) | Cod sursa (job #342672) | Cod sursa (job #1519378) | Cod sursa (job #2199446)
// Copyright (C) 2018 Gheoace Mihai - All Rights Reserved
#include<cstdio>
#include<bitset>
#include<cstdlib>
#include <cstring>
using namespace std;
bitset < 100001 > viz;
#define N 100002
typedef struct nod{
int a;
nod* urm;
} *Pnod;
Pnod v[100001];
void Push(Pnod &dest,int val)
{
Pnod p;
p = new nod;
p->a = val;
p->urm = dest;
dest = p;
}
void dfs(int i)
{
Pnod p;
viz[i] = 1;
for (p = v[i]; p != NULL; p = p->urm)
if (!viz[p->a])
dfs(p->a);
}
int S[N]; // stiva de noduri care vor fi vizitate.
int Cost[N]; // distanta intre nodul x(de unde incepe bfs).
// si nodul i
void BFS(int rad){
int l=1;
// setam toate nodurile nevizitate.
memset(Cost, -1, sizeof(int) * N);
S[l] = rad; // introduc nodul de start in coada.
Cost[rad]=0;
int i,j;
for (i = 1; i <= l; ++i) // parcurg nodurile din coada si se scot.
for (Pnod p = v[S[i]]; p != NULL; p = p->urm)
if( Cost[p->a] == -1){
S[++l] = p->a; // adaug nodul in coada.
Cost[p->a]=Cost[S[i]]+1; // salvez distanta nodul curent si tatal sau.
}
}
int main(){
int n, m;
int x, y, i, s;
FILE *f = freopen("bfs.in", "r", stdin),
*g = freopen("bfs.out", "w", stdout);
scanf("%d %d %d", &n, &m, &s);
for(i=0;i<m;++i){ // citeste arcele sub forma unei liste de vecini.
scanf("%d %d",&x,&y);
Push(v[x],y);
// Push(v[y],x);.
}
BFS(s);
for(i=1;i<=n;++i)
printf("%d ",Cost[i]);
printf("\n");
}