Pagini recente » Cod sursa (job #2769130) | Cod sursa (job #1690395) | Cod sursa (job #3222796) | Cod sursa (job #3174899) | Cod sursa (job #1316111)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("bfs.in");
ofstream g("bfs.out");
// algrotimul afla distanta cea mai scurta de la s la toate punctele (inslusiv la sine)
int n,s,lista [10001][10001],pas,sf,inc,parcurgere [10001],traseu [10001];
long m;
void citire ()
{
int x,y;
f>>n>>m>>s; // n varfuri, m arce , s varful in care trebuie sa se ajunga
long i;
for (i=1;i<=m;i++)
{
f>>x>>y;
lista [x][0] ++; // memoreaza numarul de muchii la care se duce i
lista [x][lista[x][0]]=y;
}
}
void init ()
{
int i;
for (i=1;i<=sf;i++)
parcurgere [i] = 0;
for (i=1;i<=n;i++)
traseu [i] =0;
}
void bfs (int p)
{
int i;
inc=1;
sf=1;
parcurgere [inc] =s; //
traseu [s] = 1; // memoreaza faptul ca a trecut prin acel puncte deja si ce valoare avea atunci in el
pas =0;
while (inc <=sf )
{
int x=parcurgere [inc];
pas = traseu [x];
pas ++;
for (i=1;i<=lista [x][0];i++)
if (lista [x][i]==p)
{
g << pas-1 << " ";
init (); // reface tot la 0
return ;
}
else
if (traseu [lista [x][i]]==0)
{
traseu [lista [x][i]] =pas;
sf++;
parcurgere [sf] = lista [x][i];
}
inc ++;
}
g << -1 << " ";
init (); // reface tot la 0
}
int main()
{
citire ();
int i;
for (i=1;i<s;i++)
bfs (i);
g << 0 << " ";
for (i=s+1;i<=n;i++)
bfs (i);
return 0;
}