Cod sursa(job #957076)

Utilizator lucky1992Ion Ion lucky1992 Data 4 iunie 2013 14:11:24
Problema BFS - Parcurgere in latime Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <list>
#include <queue>
#include <climits>

#define MAX 1000000

#define WHITE -100
#define BLACK -101
#define GREY -102

using namespace std;

class Graph{
	
	private:
	
	int N, M;
	list<int> nodes;
	list<int> edges[MAX];
	int source;
	int dist[MAX], colour[MAX], parent[MAX];
	list<int> q;
	
	public:
	
	Graph( int s, int N, int M ){
	this->source = s;
	this->N = N;
	this->M = M;
	}
	
	void addEdge( int x, int y ){
	
		edges[x].push_back(y);
	}
	
	void bfs(){
	
	for( int i = 1 ; i <= N; i++ ){
	    this->dist[i] = INT_MAX;
	    this->parent[i] = -1;
	    this->colour[i] = WHITE;
	}
	
	dist[source]  = 0;
	parent[source] = -1;
	colour[source] = GREY;
	
	q.push_back(source);
	
	while(!q.empty()){
	
	int u = q.front();
	cout<< "u  is : " << u<<endl;
	
	for( std::list<int>::iterator it = edges[u].begin(); it != edges[u].end(); it++ ){
			
		if( colour[*it] == WHITE ){
			
			dist[*it] = dist[u] + 1;
			parent[*it]  = u;
			colour[*it] = GREY;
			q.push_back(*it);
		}
	}
	
	colour[u] = BLACK;
	q.pop_front();
	
	}
	
	}

	int getDist( int node ){
	
	 if( dist[node] == INT_MAX )
	 	return -1;
	 else 
	 	return dist[node];
	
	}
};
	
	
	
	
int main (){
	
	ifstream in("bfs.in");
	ofstream out("bfs.out");
	
	int N,M,S,x,y;
	in >> N >> M >> S;
	
	Graph* g = new Graph( S, N, M );
	
	for( int i = 0 ; i < M; i++ ){
		in >> x >> y;
		g->addEdge(x,y);
	}
	g->bfs();
	
	for( int i = 1; i <= N; i++ )
		out<< g->getDist(i) <<" ";
     
    
     return 0;
}