c语言写一个深度优先搜索方法求出无向图通过给定点v的简单回路
时间: 2023-12-25 22:05:45 浏览: 89
好的,以下是一个使用深度优先搜索方法求出无向图通过给定点v的简单回路的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100 // 最大顶点数
#define MAX_EDGES 100 // 最大边数
int visited[MAX_VERTICES]; // 标记是否访问过
int graph[MAX_VERTICES][MAX_VERTICES]; // 无向图邻接矩阵
int n, m; // 顶点数和边数
void dfs(int v, int parent, int start, int *found) {
visited[v] = 1; // 标记为已访问
int i;
for (i = 0; i < n; i++) {
if (graph[v][i]) {
if (visited[i] && i != parent && i == start) { // 找到了简单回路
*found = 1;
return;
} else if (!visited[i]) {
dfs(i, v, start, found);
if (*found) { // 找到了简单回路
return;
}
}
}
}
}
int find_simple_cycle(int v) {
int i, found = 0;
for (i = 0; i < n; i++) {
visited[i] = 0;
}
dfs(v, -1, v, &found);
return found;
}
int main() {
int i, j, u, v;
printf("请输入无向图的顶点数和边数:");
scanf("%d%d", &n, &m);
printf("请输入无向图的边(格式:起点 终点):\n");
for (i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
graph[u][v] = graph[v][u] = 1;
}
printf("请输入给定点v:");
scanf("%d", &v);
if (find_simple_cycle(v)) {
printf("图中存在以%d为起点的简单回路。\n", v);
} else {
printf("图中不存在以%d为起点的简单回路。\n", v);
}
return 0;
}
```
这个程序首先读入无向图的顶点数和边数,然后读入每条边的信息,用邻接矩阵表示图。接着读入给定点v,调用函数find_simple_cycle来查找以v为起点的简单回路。函数中使用深度优先搜索来遍历图,如果找到了一个已经访问过的点i,且i不是当前点v的父节点,且i等于起点start,那么就找到了一个简单回路。如果遍历完整个图都没有找到简单回路,就返回0表示不存在。
希望这个例子对您有所帮助!
阅读全文