Pagini recente » Cod sursa (job #2155344) | Cod sursa (job #1448944) | Cod sursa (job #810006) | Cod sursa (job #1946768) | Cod sursa (job #957076)
Cod sursa(job #957076)
#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;
}