家谱树题解

(ACM比赛时忘了拓扑怎么写时代尻古)

假设有一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:

1.从 DAG 图中选择一个没有前驱(即入度为0)的顶点并输出。

2.从图中删除该顶点和所有以它为起点的有向边。
3.重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。
image

#include<bits/stdc++.h>
using namespace std;
int n,mapp[1145][1145],in[114514],t;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		while(cin>>t&&t){
			mapp[i][t]=1;
			in[t]++;
		}
	}
	priority_queue<int,vector<int>,greater<int> > q;
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int now=q.top();
		q.pop();
		cout<<now<<" "; 
		for(int i=1;i<=n;i++){
			if(mapp[now][i]){
				in[i]--;
				mapp[now][i]=0;
				if(in[i]==0){
					q.push(i);
				}
			}
		}
	}
	return 0;
}

本文作者:LEWISAK

本文链接:https://www.cnblogs.com/lewisak/p/18502597

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   LEWISAK  阅读(11)  评论(0编辑  收藏  举报
/
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示