HDU 1285-确定比赛名次 ( 拓扑排序)

题意:给若干比赛结果,按字典序输出比赛排名

思路:拓扑排序,利用BFS建立结点关系。

时间复杂度:O(V+E)

代码

#include<bits/stdc++.h>
using namespace std;
const int N=5e2+5;
int in[N],n,m,u,v,now;
int g[N][N];
#define mst(a) memset(a,0,sizeof a)
void toposort(){//拓扑排序 
	priority_queue<int,vector<int>,greater<int> >q;//优先队列输出最小编号 
	for(int i=1;i<=n;i++) if(!in[i]) q.push(i);//入度为0的点入队 
	int c=1;//控制输出格式 
	while(q.size()){
		now=q.top();q.pop();
		if(c!=n) printf("%d ",now),c++;
		else printf("%d\n",now);
		for(int i=1;i<=n;i++)
			if(g[now][i]) //相邻点入度减1 
			{
				in[i]--;
				if(!in[i]) q.push(i);
			} 
	} 
}
int main(){
	while(cin>>n>>m){
		mst(in),mst(g);//初始化 
		while(m--){
			cin>>u>>v;
			if(!g[u][v])//防止重边影响入度. 
			g[u][v]=1,in[v]++;
		}
		toposort();
	}
	return 0;
}