数据结构 图(六)

拓扑排序


拓扑排序:由一个集合上的偏序得到该集合上的一个全序(不唯一)。
若集合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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值