1. 程式人生 > >拓撲排序模板

拓撲排序模板

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
vector<int> G[1005];//STL大法存圖。
queue<int> q;//q陣列每次存的是當前所有入讀為0的點。
int in[1005];//in數維護的是當前所有點的入度。
int main()
{
	int n,m;
	cin>>n>>m;//n個點,m條邊.
	for(register int i=0;i<m;++i)
	{
		int x,y;
		cin>>x>>y;
		G[x].push_back(y);//表示x到y有一條邊。
		in[y]++;//y點的入度+1.
	}
	for(register int i=1;i<=n;++i)
	if(!in[i])q.push(i);//第一遍查詢所有入度為0的點。
	while(!q.empty())
	{
		int now=q.front();
		cout<<now<<" ";//輸出當前入度為0的點。
		q.pop();
		for(register int i=0;i<G[now].size();++i)
		{
			int v=G[now][i];//now到v有一條邊。
			in[v]--;//把這條邊刪掉,相當於把v的入度-1。
			if(!in[v])//如果當前v點的入度已經為0了,那麼把v加入到q中。
				q.push(v);
		}
	}
}
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
vector<int> G[1005];
queue<int> q;
int in[1005];
int main()
{
	int n,m;
	cin>>n>>m;
	for(register int i=0;i<m;++i)
	{
		int x,y;
		cin>>x>>y;
		G[x].push_back(y);
		in[y]++;
	}
	for(register int i=1;i<=n;++i)
	if(!in[i])q.push(i);
	while(!q.empty())
	{
		int now=q.front();
		cout<<now<<" ";
		q.pop();
		for(register int i=0;i<G[now].size();++i)
		{
			int v=G[now][i];
			in[v]--;
			if(!in[v])
				q.push(v);
		}
	}
}