Pagini recente » Cod sursa (job #2394551) | Cod sursa (job #128359) | infoarena 2 | Cod sursa (job #1729707) | Cod sursa (job #1316730)
#include <iostream>
#include <fstream>
#include <cstdlib>
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,pas,sf,inc;
long m;
int **matrice = (int**) malloc (100000 * sizeof (int*));
int *parcurgere = (int*) malloc (100000* sizeof (int*));
int *traseu = (int*) malloc (100000 * sizeof (int*));
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;
matrice [x][y] =1;
}
}
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<=n;i++)
if (matrice [x][i])
{
if (i==p)
{
g << pas-1 << " ";
init (); // reface tot la 0
return ;
}
else
if (traseu [i]==0)
{
traseu [i] =pas;
sf++;
parcurgere [sf] = i;
}
}
inc ++;
}
g << -1 << " ";
init (); // reface tot la 0
}
int main()
{
int i;
for (i=1;i<=100000;i++) matrice [i] = (int*) malloc (100000 * sizeof (int));
citire ();
for (i=1;i<s;i++)
bfs (i);
g << 0 << " ";
for (i=s+1;i<=n;i++)
bfs (i);
return 0;
}