Pagini recente » Cod sursa (job #1187827) | Cod sursa (job #1558168) | Cod sursa (job #582322) | Cod sursa (job #167720) | Cod sursa (job #2262906)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
struct Node{
int routeLength;
int thisNode;
};
class Graph{
private:
int V;
vector<int>* adj;
public:
Graph(int V);
void addEdge(int v, int w);
int BFS(int s, int end);
};
Graph::Graph(int V){
this->V = V;
adj = new vector<int>[V];
}
void Graph::addEdge(int v, int w){
adj[v].push_back(w);
}
int Graph::BFS(int s, int end){
bool *visited = new bool[V];
for(int i=0; i<V; i++)
visited[i] = false;
queue<Node> Q;
Node sourceNode;
sourceNode.thisNode = s;
sourceNode.routeLength = 0;
visited[s] = true;
Q.push(sourceNode);
while(!Q.empty()){
sourceNode = Q.front();
Q.pop();
if(sourceNode.thisNode == end)
return sourceNode.routeLength;
vector<int>::iterator it = adj[sourceNode.thisNode].begin();
for(; it!=adj[sourceNode.thisNode].end(); ++it){
if(!visited[*it]){
visited[*it] = true;
Node newNode;
newNode.thisNode = *it;
newNode.routeLength = sourceNode.routeLength + 1;
Q.push(newNode);
}
}
}
return -1;
}
int main(){
ifstream read("bfs.in");
ofstream write("bfs.out");
int verticesNumber, edgeNumber, sourceNode;
cin>>verticesNumber>>edgeNumber>>sourceNode;
Graph g(verticesNumber);
for(int i=0; i<edgeNumber; i++)
{
int x, y;
cin>>x>>y;
x--;
y--;
if(x!=y)
g.addEdge(x, y);
}
for(int i=0; i<verticesNumber; i++)
cout<<g.BFS(sourceNode-1, i)<<" ";
return 0;
}