Pagini recente » Rating Toth Alexandra (tothalexandra) | Istoria paginii utilizator/hamfau | Istoria paginii utilizator/omara | Istoria paginii utilizator/tudor16 | Cod sursa (job #2203670)
#include <stdio.h>
#include <vector>
#include <queue>
#define inf 999999999
using namespace std;
int nrv, nrm, s;
vector < vector <int > > adia;
vector <char> culori;
vector <int> parinte, distanta;
queue<int> coada;
void citire();
void bfs();
void afisare();
int main(){
citire();
bfs();
afisare();
return 0;
}
void citire(){
FILE* f = fopen("bfs.in", "r");
fscanf(f, "%d%d%d", &nrv, &nrm, &s);
adia.resize(nrv + 10);
for(int i = 1; i <= nrv; i++)
adia[i].push_back(0);
culori.resize(nrv + 10);
parinte.resize(nrv + 10);
distanta.resize(nrv + 10);
int x, y;
for(int i = 0; i < nrm; i++){
fscanf(f, "%d%d", &x, &y);
adia[x][0]++;
adia[x].push_back(y);
}
fclose(f);
}
void bfs(){
for(int u = 1; u <= nrv; u++)
if(u != s){
culori[u] = 'a';
distanta[u] = inf;
parinte[u] = 0;
}
culori[s] = 'g';
distanta[s] = 0;
parinte[s] = inf;
coada.push(s);
int u = 0;
while(!coada.empty()){
u = coada.front();
for(int v = 1; v <= adia[u][0]; v++){
if(culori[adia[u][v]] == 'a'){
culori[adia[u][v]] = 'g';
distanta[adia[u][v]] = distanta[u] + 1;
parinte[adia[u][v]] = u;
coada.push(adia[u][v]);
}
}
coada.pop();
culori[u] = 'n';
}
}
void afisare(){
FILE* f = fopen("bfs.out", "w");
for(int i = 1; i <= nrv; i++)
if(distanta[i] != inf)
fprintf(f, "%d ", distanta[i]);
else
fprintf(f, "-1 ");
//fprintf(f, "%c ", culori[i]);
fclose(f);
}