Pagini recente » Cod sursa (job #1109451) | Cod sursa (job #2557190) | Cod sursa (job #272427)
Cod sursa(job #272427)
#include <stdio.h>
#define max 100008
typedef struct elcoada {int nrnod; int cost;};
int cp, cu = -1;
int n,m,s;
int l[max][max], r[max], viz[max];
elcoada c[max];
void citeste ()
{
int i,y,x;
FILE * in = fopen("bfs.in","r");
fscanf(in, "%d %d %d", &n, &m, &s);
for (i=0; i<m; i++)
{
fscanf(in, "%d %d", &x, &y);
l[x][0]++;
l[x][l[x][0]] = y;
}
fclose(in);
}
void scrie ()
{
int i;
FILE * out = fopen("bfs.out", "w");
for (i=1; i<=n; i++)
{
fprintf(out, "%d ", r[i]);
}
fclose(out);
}
void add (int nrnod, int cost)
{
elcoada k;
k.nrnod = nrnod;
k.cost = cost;
if (cu == max)
{
cu = 0;
}
else
{
cu++;
}
c[cu] = k;
}
elcoada get ()
{
elcoada k;
k = c[cp];
if (cp == max)
{
cp = 0;
}
else
{
cp++;
}
return k;
}
void calc (int e)
{
elcoada k;
int nrnod, cost,i;
//reseteaza coada
cp = 0;
cu = -1;
//reseteaza nodurile vizitate
for (i=1; i<=n; i++)
{
viz[i] = 0;
}
if (s == e)
{
r[e] = 0;
return;
}
add(s, 0);
while (1==1)
{
k = get();
nrnod = k.nrnod;
cost = k.cost;
viz[nrnod] = 1;
if (l[nrnod][0] == 0)
{
r[e] = -1;
break;
}
for (i=1; i<=l[nrnod][0]; i++)
{
if (l[nrnod][i] == e)
{
r[e] = cost+1;
return;
}
else
{
if (viz[l[nrnod][i]] == 0)
{
add(l[nrnod][i], cost+1);
}
}
}
}
}
void rezolva ()
{
int i;
for (i=1; i<=n; i++)
{
calc(i);
}
}
int main ()
{
citeste();
rezolva();
scrie();
return 0;
}