Pagini recente » Cod sursa (job #533046) | Cod sursa (job #1791666) | Cod sursa (job #408918) | Cod sursa (job #1326247) | Cod sursa (job #957070)
Cod sursa(job #957070)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <list>
#include <queue>
#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];
queue<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] = -1;
this->parent[i] = -1;
this->colour[i] = WHITE;
}
dist[source] = 0;
parent[source] = -1;
colour[source] = GREY;
q.push(source);
while(!q.empty()){
int u = q.back();
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(*it);
}
}
colour[u] = BLACK;
q.pop();
}
}
int getDist( int node ){
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;
}