Cod sursa(job #710722)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 10 martie 2012 17:13:04
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

#define nmax 101000

class graf{
	

public:
	
	vector<int> adj[nmax];
	
	void add(int a, int b);
};

void graf::add(int a, int b){
	
	adj[a].push_back(b);
}

	

graf G;
int N,M,a,b,nr,S;
int viz[nmax];
int C[nmax];

void dfs(int nod){
	
	if (viz[nod])
		return ;
	viz[nod]=1;
	
	vector<int> :: iterator it;
	
	for (it=G.adj[nod].begin();it!=G.adj[nod].end();++it) 
		   if (!viz[*it])
			   dfs(*it);
}

void bfs(int nod){
	
	queue<int> Q;
	vector<int> :: iterator it;
	
	Q.push(nod);
	viz[nod]=1;
	
	while(!Q.empty()){
		
		int x=Q.front();
		Q.pop();
		
		for (it=G.adj[x].begin();it!=G.adj[x].end();++it)
			 if (!viz[*it]){
				 viz[*it]=1;
				 Q.push(*it);
				 C[*it]=C[x]+1;
			 }
	}
}

int main(){
	
	int i;
	
	freopen("bfs.in","r",stdin);
	freopen("bfs.out","w",stdout);
	
	scanf("%d %d %d", &N, &M, &S);
	while(M--){

		scanf("%d %d", &a, &b);
		G.add(a,b);
		//G.add(b,a);
	}
	
	/*nr=0;
	
	for (i=1;i<=N;++i)
		 if (!viz[i]){
			 nr++;
			 dfs(i);
		 }
		 
	printf("%d\n", nr);

	*/
	memset(viz,0,sizeof(viz));
	bfs(S);
	for (i=1;i<=N;++i)
		 if (C[i]==0)
			 C[i]=-1;
		 C[S]=0;
	for (i=1;i<=N;++i)
         printf("%d ", C[i]); 		
	
	return 0;
}