给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0
#include <cstdio>
#include <queue>
#include <iostream>
using namespace std;
#define MAX 10
int a[MAX][MAX], dfs_visited[MAX], bfs_visited[MAX], N, E; //dfs_visited数组表示dfs
queue<int> q;
void dfs(int c){
dfs_visited[c] = 1; //1表示访问过了
printf(" %d", c);
for(int i = 0; i < N; i++)
if(a[c][i] && !dfs_visited[i]) //利用二维数组的一行就是该节点的邻接点,如果那个邻接点还没没访问过则递归访问
dfs(i);
}
void bfs(int c){
bfs_visited[c] = 1; //1表示访问过了
q.push(c);
printf(" %d", c);
while(!q.empty()){ //如果队列不空则每次从队列中取出一个节点找出该节点的第一层bfs节点,并加入队列中
int temp = q.front();
q.pop();
for(int i = 0; i < N; i++){ //找出第一层bfs的节点,依次输出并加入队列,跟树的层次遍历很像
if(a[temp][i] && !bfs_visited[i]){
printf(" %d", i);
bfs_visited[i] = 1;
q.push(i);
}
}
}
}
int main(){
int temp1, temp2;
scanf("%d%d", &N, &E);
for(int i = 0; i < E; i++){
scanf("%d%d", &temp1, &temp2);
a[temp1][temp2] = 1; //因为是无向图所有邻接矩阵是关于主对角线对称的
a[temp2][temp1] = 1;
}
for(int i = 0; i < N; i++){
if(!dfs_visited[i]){
putchar('{');
dfs(i);
printf(" }\n");
}
}
for(int i = 0; i < N; i++){
if(!bfs_visited[i]){
putchar('{');
bfs(i);
printf(" }\n");
}
}
return 0;
}