用 C 语言编写DFS程序,用于解决图的连通性问题。该程序的输入包括三个整数 m、n、start,分别代表图中节点数、边数以及起始节点编号。程序通过读入 n 行数据,每行包括两个整数 a 和 b,代表节点 a 和节点 b 之间有一条边。在程序中,使用邻接矩阵 v 来存储图的信息,使用 visited 数组来记录节点是否被访问过。 程序从起始节点开始进行 DFS,对于每个节点,如果它与当前节点有连边且未被访问,就将其加入栈中,并输出该节点的编号。当某个节点的所有邻居节点都被访问过后,将该节点弹出栈并输出其编号。最后,程序检查是否有未被访问的节点,如果有,则说明图不连通,输出 0。
时间: 2024-03-08 17:51:28 浏览: 40
好的,以下是一份用 C 语言编写的深度优先搜索程序,用于解决图的连通性问题:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1005
int m, n, start;
int visited[MAXN];
int v[MAXN][MAXN];
int stack[MAXN];
int top = -1;
int isEmpty() {
return top == -1;
}
void push(int x) {
stack[++top] = x;
visited[x] = 1;
}
int pop() {
int x = stack[top--];
return x;
}
void dfs(int root) {
push(root);
printf("%d ", root);
while (!isEmpty()) {
int cur = stack[top];
int flag = 1;
for (int i = 1; i <= m; i++) {
if (v[cur][i] && !visited[i]) {
push(i);
printf("%d ", i);
flag = 0;
break;
}
}
if (flag) {
int x = pop();
printf("%d ", x);
}
}
}
int main() {
scanf("%d %d %d", &m, &n, &start);
for (int i = 1; i <= n; i++) {
int a, b;
scanf("%d %d", &a, &b);
v[a][b] = 1;
v[b][a] = 1;
}
dfs(start);
int flag = 1;
for (int i = 1; i <= m; i++) {
if (!visited[i]) {
flag = 0;
break;
}
}
if (flag) {
printf("Graph is connected.\n");
} else {
printf("Graph is not connected.\n");
}
return 0;
}
```
在这个程序中,我们使用了一个栈来存储遍历过程中的节点,通过不断加入和弹出栈中的节点,实现了深度优先搜索的过程。同时,我们使用了邻接矩阵来表示图的信息,方便了节点之间的连通关系的表示和处理。为了判断图的连通性,我们在遍历结束后,检查是否有未被访问的节点,如果有,则说明图不连通,输出 "Graph is not connected.",否则输出 "Graph is connected."。
阅读全文