AtCoderD - Restricted Permutation 拓扑排序模板题:拓扑排序+优先队列

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoderD - Restricted Permutation 拓扑排序模板题:拓扑排序+优先队列相关的知识,希望对你有一定的参考价值。

D

关于拓扑排序的知识:
拓扑排序入门(真的很简单)
拓扑排序算法分析(通俗易懂)

看完秒懂。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fir(i,a,n) for(int i=a;i<=n;i++)
//======================
const int N=2e5+10;
int n,m;
vector<int>g[N];//我有哪些小弟 
int deg[N];//我有几个大哥 
priority_queue<int,vector<int>,greater<int>>q;
vector<int>ans;

void bfs()
{
	fir(i,1,n)
	{
		if(!deg[i]) q.push(i);
	}
	while(q.size())
	{
		int t=q.top();q.pop();
		ans.pb(t);
		for(int i=0;i<g[t].size();i++)
		{
			int tt=g[t][i];
			deg[tt]--;
			if(!deg[tt]) q.push(tt);
		}
	}
	
	if(ans.size()==n)
	{
		for(int i=0;i<ans.size();i++)
		{
			cout<<ans[i];
			if(i!=ans.size()-1) cout<<" ";
		}
	}
	else cout<<-1;
}
int main()
{
	cin>>n>>m;
	fir(i,1,m)
	{
		int a,b;scanf("%d%d",&a,&b);//a在b前 
		g[a].pb(b);
		deg[b]++;
	}
	
	bfs();
	return 0; 
}

以上是关于AtCoderD - Restricted Permutation 拓扑排序模板题:拓扑排序+优先队列的主要内容,如果未能解决你的问题,请参考以下文章

AtCoderD - Cooking 动态规划

AtCoderD - Querying Multiset 优先队列

AtcoderD - Integer Cards 贪心

AtCoderD - Coprime 2 欧拉筛

AtCoderD - Collision bfs+预处理

AtCoderD - Kth Excluded 差分+思维