Pagini recente » Monitorul de evaluare | Profil Robybrasov | Cod sursa (job #2486751) | Monitorul de evaluare | Cod sursa (job #1889096)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define nmax 100010
using namespace std;
ifstream q("bfs.in");
ofstream w("bfs.out");
int n,m,s;
vector<int> v[nmax];
queue<int> c;
vector<int>::iterator it; //asa arata declararea. Dubioasa, dar o vom folosi cum este data.
int a[1000010];
int *Map;
void bfs()
{
int x,aux;
c.push(s); //Adugam in q, nodul nostru s
while(!c.empty())
{
x=c.front(); //luam elementul la care ne aflam
aux=a[x];
for(it=v[x].begin(); it<v[x].end(); it++)
{
if(a[*it]==-1)
{
a[*it]=aux+1; //adugam plus 1 la distanta elementului care este legat de acest element inca neinitializat cu altceva > -1
c.push(*it);
}
}
c.pop(); //stergem primul element, de altfel, cel folosit
}
}
int main()
{int i,x,y;
q>>n>>m>>s;
for(i=1;i<=n;i++) a[i]=-1; //initializam cu imposibilitatea de a ajunge la nodul respectiv (aceasta fiind -1)
for(i=1;i<=m;i++)
{
q>>x>>y;
v[x].push_back(y);
}
bfs();
for(i=1;i<=n;i++)
{
if(i==s && a[s]==0) w<<"0 "; //daca nodul s are drum spre el insusi, atunci ramane 0. La restul vom adauga 1 (cele diferite de -1, desigur)
else if(a[i]==-1) w<<"-1 ";
else w<<a[i]+1<<" ";
}
return 0;
}