使用c对有向无环图,按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。由此所得顶点的线性序列称之为拓扑有序序列。 输入有向图的相关信息,若图中无环,输出其拓扑有序序列,否则输出“此有向图不是有向无环图”。 因拓扑有序序列不唯一,故要求如下: (1)使用邻接表存储图。邻接表的每个链表中,要求按顶点的序号从大到小排列; (2)使用栈辅助操作。初始时,入度为0的顶点入栈时,也按顶点的序号从大到小的顺序入栈。 输入说明: 输入有向图的顶点数、边数、各顶点的值,各边的信息。 输出说明: 若有向图中无环,输出其拓扑有序序列,否则输出“此有向图不是有向无环图”。 拓扑有序序列的每个顶点数据后有一个空格。 输入样例: 6 8 1 2 3 4 5 6 1 2 1 3 1 4 3 2 3 5 4 5 6 4 6 5 输出样例: 1 3 2 6 4 5
时间: 2024-02-20 12:57:39 浏览: 76
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
以下是使用C语言实现的拓扑排序代码,使用邻接表存储图,使用栈辅助操作:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100 // 最大顶点数
// 边表结点
typedef struct EdgeNode {
int adjvex; // 邻接点域,存储该顶点对应的下标
struct EdgeNode *next; // 链域,指向下一个邻接点
} EdgeNode;
// 顶点表结点
typedef struct VertexNode {
int data; // 顶点域,存储顶点信息
EdgeNode *firstedge; // 边表头指针
} VertexNode, AdjList[MAXVEX];
// 图结构
typedef struct {
AdjList adjList; // 邻接表
int numVertexes; // 图中当前的顶点数
int numEdges; // 图中当前的边数
} GraphAdjList;
// 入度数组
int indegree[MAXVEX];
// 拓扑排序
int TopologicalSort(GraphAdjList *G) {
int i, k, count = 0;
int top = -1;
EdgeNode *e;
// 初始化入度数组
for (i = 0; i < G->numVertexes; i++) {
indegree[i] = 0;
}
// 计算所有顶点的入度
for (i = 0; i < G->numVertexes; i++) {
e = G->adjList[i].firstedge;
while (e != NULL) {
indegree[e->adjvex]++;
e = e->next;
}
}
// 将所有入度为0的顶点入栈
for (i = G->numVertexes - 1; i >= 0; i--) {
if (indegree[i] == 0) {
top++;
stack[top] = i;
}
}
// 拓扑排序
while (top != -1) {
k = stack[top];
top--;
printf("%d ", G->adjList[k].data);
count++;
e = G->adjList[k].firstedge;
while (e != NULL) {
indegree[e->adjvex]--;
if (indegree[e->adjvex] == 0) {
top++;
stack[top] = e->adjvex;
}
e = e->next;
}
}
// 如果排序后顶点数小于总数,则说明存在环
if (count < G->numVertexes) {
return -1;
}
return 0;
}
int main() {
int i, j, k;
GraphAdjList G;
EdgeNode *e;
// 输入顶点数和边数
scanf("%d %d", &G.numVertexes, &G.numEdges);
// 输入顶点信息
for (i = 0; i < G.numVertexes; i++) {
scanf("%d", &G.adjList[i].data);
G.adjList[i].firstedge = NULL;
}
// 输入边信息,构建邻接表
for (k = 0; k < G.numEdges; k++) {
scanf("%d %d", &i, &j);
// 新建一个边表结点
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = j;
// 将e插入到顶点i的边表头部
e->next = G.adjList[i].firstedge;
G.adjList[i].firstedge = e;
}
// 拓扑排序
if (TopologicalSort(&G) == -1) {
printf("此有向图不是有向无环图\n");
}
return 0;
}
```
阅读全文