拓扑排序模板

给一个有向无环图求顺序

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N = 1010;
typedef vector<int> vi;
vector<int>g[N];
vi ans;
int in[N];
int topo(int n)
{
	for(int i=1;i<=n;i++)
	{
		if(in[i]==0) ans.pb(i);
	}
	for(int i=0;i<ans.size();i++)
	{
		int u=ans[i];
		for(int j=0;j<g[u].size();j++)
		{
			int v=g[u][j];
			in[v]--;
			if(in[v]==0) ans.pb(v);
		}
	}
}
int main()
{	
	int n,m,a,b;
	memset(in,0,sizeof(in));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		g[a].pb(b);
		in[b]++;
	}
	topo(n);
	cout<<ans.size()<<endl;
	for(int i=0;i<ans.size();i++)
	{
		printf("%d ",ans[i]);
	}
	cout<<endl;
} 


posted @ 2017-10-28 11:04  Linese  阅读(97)  评论(0编辑  收藏  举报