由于这个题需要按从小到大的顺序访问,如果使用邻接表的话,在存储边的时候需要按照节点大小进行存储,会比较麻烦,所以这道题使用邻接矩阵是比较方便的。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class Graph{
public:
vector<vector<int>> m_graph;
int m_nodeNum;
int m_edgeNum;
Graph(int nodeNum, int edgeNum): m_graph(vector<vector<int>>(nodeNum,vector<int>(nodeNum, 0))), m_nodeNum(nodeNum),
m_edgeNum(edgeNum){}
void insert(int node1, int node2);
};
void Graph::insert(int node1, int node2) {
m_graph[node1][node2] = m_graph[node2][node1] = 1;
m_edgeNum++;
}
void DFS(int startNode, Graph& graph, vector<int>& path, vector<bool>& visited){
int curNode = startNode;
visited[curNode] = true;
path.push_back(curNode);
for(int i = 0; i < graph.m_nodeNum; i++){
if(graph.m_graph[curNode][i] == 1 && !visited[i])
DFS(i, graph, path, visited);
}
}
void BFS(int startNode, Graph& graph, vector<int>& path, vector<bool>& visited){
queue<int> que;
visited[startNode] = true;
que.push(startNode);
while(!que.empty()){
int curNode = que.front();
que.pop();
path.push_back(curNode);
for(int i = 0; i < graph.m_nodeNum; i++){
if(graph.m_graph[curNode][i] == 1 && !visited[i]){
visited[i] = true;
que.push(i);
}
}
}
}
int main(){
int nodeNum, edgeNum;
cin >> nodeNum >> edgeNum;
Graph graph(nodeNum, edgeNum);
for(int i = 0; i < edgeNum; i++){
int node1, node2;
cin >> node1 >> node2;
graph.insert(node1, node2);
}
vector<vector<int>> DFSPaths;
vector<bool> visited(nodeNum, false);
for(int i = 0; i < nodeNum; i++){
if(!visited[i]){
vector<int> path;
DFS(i, graph, path, visited);
DFSPaths.push_back(path);
}
}
vector<vector<int>> BFSPaths;
fill(visited.begin(), visited.end(), false);
for(int i = 0; i < nodeNum; i++){
if(!visited[i]){
vector<int> path;
BFS(i, graph, path, visited);
BFSPaths.push_back(path);
}
}
for(auto path : DFSPaths){
cout << "{ ";
for(int node : path){
cout << node << " ";
}
cout << "}" << endl;
}
for(auto path : BFSPaths){
cout << "{ ";
for(int node : path){
cout << node << " ";
}
cout << "}" << endl;
}
}