无向图深度优先求任意两点所有路径代码 c语言
时间: 2023-08-12 22:16:23 浏览: 103
求解无向图中任意两点之间的所有路径的C#实现
5星 · 资源好评率100%
以下是无向图深度优先搜索求任意两点所有路径的 C 语言代码:
```c
#include <stdio.h>
#define MAXN 100 // 最大点数
int G[MAXN][MAXN]; // 邻接矩阵表示图
int vis[MAXN]; // 标记数组,记录每个点是否被访问过
int path[MAXN]; // 记录当前路径
int top; // 栈顶指针,用于回溯
// 深度优先搜索函数
void dfs(int u, int v) {
vis[u] = 1;
path[++top] = u; // 将 u 入栈
if (u == v) { // 找到一条路径
for (int i = 1; i <= top; i++) {
printf("%d ", path[i]);
}
printf("\n");
} else {
for (int i = 0; i < MAXN; i++) {
if (G[u][i] && !vis[i]) { // 如果存在边且未访问
dfs(i, v); // 继续搜索
}
}
}
vis[u] = 0; // 回溯,恢复现场
top--;
}
int main() {
int n, m; // n 个点,m 条边
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = 1; // 无向图
}
int s, t; // 源点和目标点
scanf("%d%d", &s, &t);
dfs(s, t);
return 0;
}
```
其中,`G` 表示邻接矩阵,`vis` 表示标记数组,`path` 表示当前路径。`dfs` 函数是深度优先搜索函数,其中 `u` 表示当前搜索的节点,`v` 表示目标节点。当 `u` 到达目标节点 `v` 时,输出当前路径;否则,遍历 `u` 的所有邻居节点并递归搜索。搜索结束后,需要回溯,恢复现场。
阅读全文