判断上图是否含有环,若没有则输出其拓扑序列。 (c语言)
时间: 2024-01-14 19:02:49 浏览: 63
有向图若有环,输出环,否则,拓扑排序
3星 · 编辑精心推荐
判断有向图是否存在环,一种常见的方法是使用拓扑排序。拓扑排序可以将有向无环图(DAG)中的节点按照一定的顺序排序,如果存在环,则无法进行拓扑排序。
下面是使用拓扑排序判断有向图是否存在环并输出拓扑序列的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
typedef struct Graph {
int num_vertices;
int adj_matrix[MAX_VERTICES][MAX_VERTICES];
} Graph;
int indegree[MAX_VERTICES];
// 初始化有向图
void init_graph(Graph *g, int n) {
g->num_vertices = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g->adj_matrix[i][j] = 0;
}
}
}
// 添加有向边
void add_edge(Graph *g, int u, int v) {
g->adj_matrix[u][v] = 1;
indegree[v]++;
}
// 拓扑排序
int topological_sort(Graph *g, int *sorted) {
int queue[MAX_VERTICES];
int front = -1, rear = -1;
int cnt = 0;
// 将入度为 0 的节点入队
for (int i = 0; i < g->num_vertices; i++) {
if (indegree[i] == 0) {
queue[++rear] = i;
}
}
while (front != rear) {
int u = queue[++front];
sorted[cnt++] = u;
// 将 u 的邻居节点的入度减 1,如果减为 0,则入队
for (int v = 0; v < g->num_vertices; v++) {
if (g->adj_matrix[u][v]) {
if (--indegree[v] == 0) {
queue[++rear] = v;
}
}
}
}
return cnt == g->num_vertices;
}
int main() {
Graph g;
int n, m;
int sorted[MAX_VERTICES];
scanf("%d%d", &n, &m);
// 初始化有向图
init_graph(&g, n);
// 添加有向边
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
add_edge(&g, u, v);
}
// 判断是否存在环
if (!topological_sort(&g, sorted)) {
printf("Graph has a cycle\n");
return 0;
}
// 输出拓扑序列
for (int i = 0; i < n; i++) {
printf("%d ", sorted[i]);
}
printf("\n");
return 0;
}
```
上述代码中,`Graph` 结构体表示有向图,`indegree` 数组表示每个节点的入度。`init_graph` 函数用于初始化有向图,`add_edge` 函数用于添加有向边。`topological_sort` 函数使用拓扑排序判断有向图是否存在环并输出拓扑序列。如果存在环,则返回 0;否则返回 1。
您可以将上述代码复制到 C 语言编译器中运行,输入有向图的节点数和边数,以及每条边的起点和终点,即可判断有向图是否存在环并输出拓扑序列。
阅读全文