Pagini recente » Borderou de evaluare (job #1456412) | Borderou de evaluare (job #2124780) | Borderou de evaluare (job #3263278) | Borderou de evaluare (job #2573551) | Cod sursa (job #2706916)
//Ilie Dumitru
#include<cstdio>
#include<queue>
struct nod
{
int x;
nod* next;
};
struct pereche
{
int i, j;
};
int minim[100000], N, M, S;
nod *arce[100000];
char verif[12500];
inline void setbit(int i){verif[i>>3]|=1<<(i&7);}
inline char getbit(int i){return verif[i>>3]&(1<<(i&7));}
void add(int x, int y)
{
nod *n=new nod;
n->x=y;
n->next=arce[x];
arce[x]=n;
}
void BFS()
{
std::queue<pereche> q;
nod *n;
pereche p;
setbit(S);
q.push({S, 0});
while(!q.empty())
{
p=q.front();
q.pop();
minim[p.i]=p.j;
for(n=arce[p.i];n;n=n->next)
if(!getbit(n->x))
{
setbit(n->x);
q.push({n->x, p.j+1});
}
}
}
int main()
{
FILE *f=fopen("bfs.in", "r"), *g=fopen("bfs.out", "w");
int i, a, b;
fscanf(f, "%i", &N);
fscanf(f, "%i", &M);
fscanf(f, "%i", &S);
--S;
for(i=0;i<N;++i)
minim[i]=-1;
for(i=0;i<M;++i)
{
fscanf(f, "%i%i", &a, &b);
add(a-1, b-1);
}
fclose(f);
BFS();
for(i=0;i<N;++i)
fprintf(g, "%i ", minim[i]);
fclose(g);
return 0;
}