拓扑排序判断是否有环用C语言解决存在的话输出YES不存在输出NO
时间: 2024-02-29 20:51:35 浏览: 64
以下是使用 C 语言实现拓扑排序判断是否有环,并根据结果输出 YES 或 NO 的代码:
```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,说明可以加入拓扑序列
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("YES\n");
return 0;
}
}
printf("NO\n");
return 0;
}
```
该程序与上一个程序的区别在于,当检测到存在环时,直接输出 YES 并结束程序;否则在所有节点都被加入拓扑序列后输出 NO。
阅读全文