拓扑排序判断是否有环用C语言解决
时间: 2023-07-25 07:24:38 浏览: 102
以下是使用 C 语言实现拓扑排序判断是否有环的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000
int n, m;
int indegree[MAXN]; // 存储每个节点的入度
int edges[MAXN][2]; // 存储每条边的起点和终点
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d %d", &edges[i][0], &edges[i][1]);
indegree[edges[i][1]]++; // 统计每个节点的入度
}
int cnt = 0; // 记录已经加入拓扑序列的节点数量
while (cnt < n) { // 只要还有节点没有加入拓扑序列,就继续循环
int flag = 0; // 标记本轮是否有节点加入拓扑序列
for (int i = 1; i <= n; i++) {
if (indegree[i] == 0) { // 如果节点的入度为 0,说明可以加入拓扑序列
printf("%d ", i);
indegree[i] = -1; // 将节点的入度标记为 -1,表示已经加入拓扑序列
cnt++;
for (int j = 0; j < m; j++) {
if (edges[j][0] == i) { // 将与该节点相邻的节点的入度减 1
indegree[edges[j][1]]--;
}
}
flag = 1; // 标记本轮有节点加入拓扑序列
}
}
if (!flag) { // 如果本轮没有节点加入拓扑序列,说明存在环
printf("The graph contains a cycle!\n");
break;
}
}
return 0;
}
```
该程序使用邻接表存储有向图,并使用数组 `indegree` 统计每个节点的入度。在每一轮循环中,找出所有入度为 0 的节点加入拓扑序列,并将与之相邻的节点的入度减 1,直到所有节点都被加入拓扑序列。如果在某一轮循环中没有节点可以加入拓扑序列,说明存在环。
阅读全文