1.深度优先搜索(DFS)
1.1:连通图的DFS的步骤

1.2:非连通图采用邻接矩阵存储时的DFS的代码(对于连通图也适用)
cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define Max_Vertex_Num 20
typedef char VertexType;
typedef struct {
int vexnum, arcnum;
VertexType vexs[Max_Vertex_Num];
int edges[Max_Vertex_Num][Max_Vertex_Num];
} MGraph;
bool visited[Max_Vertex_Num];
// DFS 函数(不变)
void DFS(MGraph G, int v) {
printf("%c ", G.vexs[v]);
visited[v] = true;
for (int w = 0; w < G.vexnum; w++) {
if (G.edges[v][w] == 1 && !visited[w]) {
DFS(G, w);
}
}
}
// 遍历非连通图(关键函数!)
void DFSTraverse(MGraph G) {
// 初始化所有标记为 false
memset(visited, 0, sizeof(visited));
// 对每个顶点,如果没被访问过,就开始一次DFS
for (int v = 0; v < G.vexnum; v++) {
if (!visited[v]) {
DFS(G, v);
}
}
}
// 创建图(不变)
void CreateMGraph(MGraph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar();
for (i = 0; i < G->vexnum; i++) {
printf("请输入第%d个顶点的值:", i + 1);
scanf("%c", &G->vexs[i]);
getchar();
}
memset(G->edges, 0, sizeof(G->edges));
for (k = 0; k < G->arcnum; k++) {
printf("请输入边(vi,vj)的下标i,j:");
scanf("%d%d", &i, &j);
G->edges[i][j] = 1;
G->edges[j][i] = 1;
}
}
int main() {
MGraph G;
CreateMGraph(&G);
printf("\n深度优先遍历序列(支持非连通图):");
DFSTraverse(G);
printf("\n");
return 0;
}
1.2.1:两组测试案例
cpp
// 第一组测试案例(连通图)
// 输入:
5 3
A
B
C
D
E
0 1
1 2
3 4
// 预期输出
A B C D E
//
第一组测试案例(非连通图)
顶点:A B C D E
其中:
A-B-C 连通
D-E 连通
共两个连通分量,互不相连
5 3
A
B
C
D
E
0 1
1 2
3 4
// 预期输出:A B C D E
结论:(重要)
DFSTraverse函数中调用DFS函数的次数,就是该非连通图中连通分量的个数