Pagini recente » Cod sursa (job #966569) | Cod sursa (job #2272598) | Cod sursa (job #1387376) | Cod sursa (job #2426935) | Cod sursa (job #2792263)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
using namespace std;
ifstream fin("bfs.in");
ofstream fout("bfs.out");
class Graph
{
private:
//number of nodes
int n;
//number of edges
int e;
bool oriented;
//adj list for graph representation
vector<vector<int>> adj_list;
public:
Graph(int n, bool oriented)
{
this->n = n;
this->e = 0;
this->oriented = oriented;
vector<int> empty;
for (int i = 0; i < n; i++)
{
this->adj_list.push_back(empty);
}
}
virtual ~Graph() {}
void add_edge(int node1, int node2)
{
this->e++;
this->adj_list[node1].push_back(node2);
if (!oriented)
{
this->adj_list[node2].push_back(node1);
}
}
void bfs(int start_node)
{
deque<int> unvisited;
vector<int> visited;
vector<int> answer;
for (int i = 0; i < this->n; i++)
{
answer.push_back(-1);
}
unvisited.push_back(start_node);
answer[start_node] = 0;
while (!unvisited.empty())
{
for (int i = 0; i < this->adj_list[start_node].size(); i++)
{
int key;
key = adj_list[start_node][i];
bool inVisited, inUnvisited;
inVisited = find(visited.begin(), visited.end(), key) != visited.end();
inUnvisited = find(unvisited.begin(), unvisited.end(), key) != unvisited.end();
if (!inVisited && !inUnvisited)
{
unvisited.push_back(key);
answer[key] = answer[start_node] + 1;
}
}
visited.push_back(start_node);
unvisited.pop_front();
if (!unvisited.empty())
{
start_node = unvisited[0];
}
}
for (int i = 0; i < answer.size(); i++)
{
fout << answer[i] << " ";
}
}
};
int main()
{
//number of nodes
int N;
//number of edges
int E;
//starting node
int SN;
fin >> N >> E >> SN;
Graph graph(N,true);
int n1, n2;
for (int i = 0; i < E; i++)
{
fin >> n1 >> n2;
graph.add_edge(n1 - 1, n2 - 1);
}
graph.bfs(SN - 1);
return 0;
}