我想要一个判断无向图是否有圈的C语言源代码。要求是 利用“邻接矩阵”存储无向图; 2.利用DFS(深度优先搜索算法)判断无向图中是否有圈。如果无向图中存在圈,则将所找到的圈的顶点序列依次输出,否则输出“无”。以这种形式输入:0 1 1 1 0 1 1 1 0
时间: 2024-05-09 22:15:08 浏览: 124
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
下面是一个使用邻接矩阵和DFS算法判断无向图是否有圈的C语言源代码:
```c
#include <stdio.h>
#define MAXN 100
int n; // 图中顶点数
int G[MAXN][MAXN]; // 邻接矩阵
int visited[MAXN]; // 标记访问过的顶点
int dfs(int v, int prev, int start) {
visited[v] = 1; // 标记当前顶点已经访问过
for (int i = 0; i < n; i++) {
if (G[v][i]) { // 如果顶点v和顶点i之间有一条边
if (!visited[i]) { // 如果顶点i没有被访问过
int res = dfs(i, v, start);
if (res != -1) // 找到了圈
return res;
} else if (i != prev && i == start) { // 找到了圈
return v;
}
}
}
return -1; // 没有找到圈
}
int find_cycle() {
// 从每个未访问的顶点开始深度优先搜索
for (int i = 0; i < n; i++) {
if (!visited[i]) {
int res = dfs(i, -1, i);
if (res != -1) { // 找到了圈
return res;
}
}
}
return -1; // 没有找到圈
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &G[i][j]);
}
}
int start = find_cycle(); // 找到一个圈的起点
if (start == -1) { // 没有找到圈
printf("无\n");
} else {
printf("%d", start);
visited[start] = 0;
int v = start;
while (1) { // 输出圈的顶点序列
int next = -1;
for (int i = 0; i < n; i++) {
if (G[v][i] && visited[i]) {
next = i;
break;
}
}
if (next == -1) break;
printf("-%d", next);
visited[next] = 0;
v = next;
if (v == start) break;
}
printf("-%d\n", start);
}
return 0;
}
```
输入格式为:
```
n
G[0][0] G[0][1] ... G[0][n-1]
G[1][0] G[1][1] ... G[1][n-1]
...
G[n-1][0] G[n-1][1] ... G[n-1][n-1]
```
其中,`n`为图中顶点数,`G[i][j]`表示顶点i和顶点j之间是否有一条边,如果有则为1,否则为0。输出格式为:
- 如果无向图中存在圈,则输出圈的顶点序列,顶点之间用连字符“-”隔开,最后一个顶点后面也要加一个连字符“-”,并换行结束;
- 如果无向图中不存在圈,则输出“无”,并换行结束。
例如,对于输入数据:
```
5
0 1 0 0 1
1 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
```
程序的输出为:
```
0-1-2-3-1-
```
阅读全文