Pagini recente » Cod sursa (job #1570722) | Cod sursa (job #2338255) | Cod sursa (job #524208) | Cod sursa (job #66019) | Cod sursa (job #2784683)
#include <bits/stdc++.h>
using namespace std;
ifstream in("bfs.in");
ofstream out("bfs.out");
class Graph
{
private:
int numberOfNodes, numberOfEdges;
vector<vector<int>> listOfNeighbours;
public:
Graph(int numberOfNodes = 0, int numberOfEdges = 0)
{
this->numberOfNodes = numberOfNodes;
this->numberOfEdges = numberOfEdges;
}
~Graph()
{
this->numberOfEdges = 0;
this->numberOfNodes = 0;
}
void setNumberOfEdges(int &);
void setNumberOfNodes(int &);
void setEdges(int, int);
int getNumberOfNodes();
int getNumberOfEdges();
void readEdges(istream &in);
void printListOfNeighbours(ostream &out);
int numberOfConnectedComponents(bool[]);
void BFS(int, bool[], int[]);
private:
void DFS(int, bool[]);
};
void Graph::setNumberOfEdges(int &m)
{
numberOfEdges = m;
}
void Graph::setNumberOfNodes(int &n)
{
numberOfNodes = n;
}
void Graph::setEdges(int firstNode, int secondNode)
{
listOfNeighbours[firstNode].push_back(secondNode);
}
int Graph::getNumberOfNodes()
{
return numberOfNodes;
}
int Graph::getNumberOfEdges()
{
return numberOfEdges;
}
void Graph::readEdges(istream &in)
{
int firstNode, secondNode;
listOfNeighbours.resize(numberOfNodes + 2);
for (int i = 0; i < this->numberOfEdges; i++)
{
in >> firstNode >> secondNode;
setEdges(firstNode, secondNode);
//setEdges(secondNode, firstNode);
}
}
void Graph::printListOfNeighbours(ostream &out)
{
for (int i = 1; i < this->listOfNeighbours.size() - 1; i++)
{
out << i << ": ";
for (int j = 0; j < listOfNeighbours[i].size(); j++)
out << this->listOfNeighbours[i][j] << " ";
}
}
void Graph::DFS(int node, bool visited[])
{
// int visited[listOfNeighbours.size()];
visited[node] = 1;
//out<<node<<" ";
for (int neighbour : listOfNeighbours[node])
{
// out<<neighbour<<endl;
if (!visited[neighbour])
DFS(neighbour, visited);
}
}
int Graph::numberOfConnectedComponents(bool visited[])
{
int numberOfConnectedComponents = 0;
for (int i = 1; i <= this->numberOfNodes; i++)
{
if (!visited[i])
{
// out << numberOfNodes << endl;
numberOfConnectedComponents++;
DFS(i, visited);
}
}
return numberOfConnectedComponents;
}
void Graph::BFS(int sourceNode, bool visited[], int distance[])
{
queue<int> queueBFS;
queueBFS.push(sourceNode);
visited[sourceNode] = 1;
distance[numberOfNodes] = {0};
while (!queueBFS.empty())
{
for (int node : listOfNeighbours[queueBFS.front()])
{
if (!visited[node])
{
visited[node] = 1;
queueBFS.push(node);
distance[node] = distance[queueBFS.front()] + 1;
}
}
queueBFS.pop();
}
for (int node = 1; node <= numberOfNodes; node++)
{
if (sourceNode != node && distance[node] == 0)
out << "-1 ";
else
out << distance[node] << " ";
}
}
int main()
{
int numberOfNodes, numberOfEdges, sourceNode;
in >> numberOfNodes >> numberOfEdges >> sourceNode;
Graph Gr(numberOfNodes, numberOfEdges);
Gr.readEdges(in);
bool visited[numberOfNodes + 1] = {0};
int distance[numberOfNodes + 1] = {0};
// out << Gr.numberOfConnectedComponents(visited);
// Gr.printListOfNeighbours(out);
Gr.BFS(sourceNode, visited, distance);
return 0;
}