拓扑排序(链式前向星+队列实现)

拓扑排序:对于有向无环图的排序,对于一个有向无环图来说,拓扑排序就是讲该图中的所有定点排成一个线性顺序。使得途中任意一对定点u和v,若存在边<u,v>关系,u在v之前。

实现思路:

1:从图中选择一个入度为0的顶点,并输出他

2:从图中删除该点,并且删除该定点出发的所有有向边

3:重复上述两步

代码如下:

#include<bits/stdc++.h>
using namespace std;

const int N = 100005;
const int M = 100005;
struct EdgeNode{
	int to;
	int w;
	int next;
};
EdgeNode edge[N];
int head[M];
int n,m;
int indegree[N];

void toposort(){
	int queue[N];
	int iq = 0 ;
	for(int i = 1 ; i <= n ; i++){
		if(indegree[i] == 0){
			queue[iq++] = i;
		}
	}
	for(int i = 0 ; i < iq ; i++){
		for(int k = head[queue[i]] ; k != -1 ; k = edge[k].next){
			indegree[edge[k].to] -- ;
			if(indegree[edge[k].to] == 0){
				queue[iq++] = edge[k].to;
			}
		}
	}
	for(int i = 0 ; i < iq; i ++)
		cout << queue[i] << " ";
	cout << endl; 
}
int main(){
	memset(head,-1,sizeof(head));
	memset(indegree,0,sizeof(indegree));
	cin >> n >> m;
	for(int i = 1 ; i <= m; i ++){
		int a,b,c;
		cin >> a >> b;
		edge[i].to = b;
		edge[i].w  = c;
		edge[i].next = head[a];
		head[a] = i;
		indegree[b] ++; 
	}
//	for(int i = 1; i <= n ; i++){
//		for(int k = head[i] ; k != -1 ; k = edge[k].next){
//			cout << i << " " << edge[k].to << " " << edge[k].w << endl;
//		}
//	}
	toposort();
	return 0 ;
} 
/*
5 5
5 4 
1 2 
2 3 
1 3 
1 5
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值