拓扑排序
拓扑排序:由一个集合上的偏序得到该集合上的一个全序(不唯一)。
若集合X上的关系R是自反的、反对称的和传递的,则称关系R是集合X上的偏序关系。
如果在此之上,对每个x、y,都有xRy和yRx成立(x、y∈X),则称R是集合X上的全序关系。
输入:
6 8
1 2 3 4 5 6
1 2
1 4
3 2
1 3
6 4
6 5
4 5
3 5
输出:
6 1 4 3 2 5
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define MAX 65535//最大值
#define ver 20//预计最大顶点个数
typedef struct {
int adjvex;
struct NEXT* next;
}NEXT;
typedef struct {
int data;
NEXT* first;
}VEXTEX;
typedef struct {
VEXTEX arc[ver];
int vexnum, srcnum;
int indegree[ver];
}GRAPH;
//邻接表构图
void Create_Graph(GRAPH* G) {
NEXT* n;
scanf("%d %d", &G->vexnum, &G->srcnum);
for (int i = 1; i <= G->vexnum; i++) {
scanf("%d", &G->arc[i].data);
G->arc[i].first = NULL;
G->indegree[i] = 0;
}
for (int i = 1; i <= G->srcnum; i++) {
int v1, v2;
scanf("%d %d", &v1, &v2);
G->indegree[v2]++;
n = (NEXT*)malloc(sizeof(NEXT));
n->adjvex = v2;
n->next = G->arc[v1].first;
G->arc[v1].first = n;
}
}
void Kahn_sort(GRAPH* G) {
NEXT* temp;
int stack[ver];// stack用于存储入度为0的节点
int top = 0;// stack栈顶指针
int sum = 0;// 加入到栈中节点个数
for (int i = 1; i <= G->vexnum; i++) {
if (G->indegree[i] == 0) {
stack[++top] = i;
}
}
while (top) {
int num = stack[top--];
printf("%d ", G->arc[num].data);
sum++;
temp = G->arc[num].first;
while (temp) {
int k = temp->adjvex;
if (!(--G->indegree[k])) {// 将k号顶点入度减1
stack[++top] = k;// 如果发现入度为0,则把该顶点加入到栈中
}
temp = temp->next;//不要忘了这一步哦,不然的话会陷入死循环
}
}
if (sum == G->vexnum) {
printf("\n");
}
else {
printf("无拓扑序列\n");
}
}
int main()
{
GRAPH* G;
Create_Graph(&G);
Kahn_sort(&G);
return 0;
}