HDU - 1285 确定比赛名次

https://vjudge.net/problem/HDU-1285

  • 去重边
  • 为什么不是1 4 而是 1 2,因为每找到一个入度为0的,和它相关的点入度都要-1,那么2就符合要求了,并且要字典序

参考

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=510;
int n,m;
int p[N],g[N][N];
vector<int> ans;
void topo()
{
	priority_queue<int,vector<int>,greater<int> > q;
	for(int i=1;i<=n;i++)
		if(p[i]==0)
			q.push(i);
	while(q.size())
	{
		int x=q.top();
		q.pop();
		ans.push_back(x);
		for(int i=1;i<=n;i++)
		{
			if(g[x][i]==1)  //和该点有关系的要减1, 
			{
				p[i]--; 
				if(p[i]==0)  //减1后变成入度为0的点 入队 按字典序输出 
					q.push(i);
			 } 
		}
	}
}
int main()
{
	while(cin>>n>>m)
	{
		memset(g,0,sizeof g);
		ans.clear();
		for(int i=0;i<m;i++)
		{
			int x,y;
			cin>>x>>y;
			if(!g[x][y]) //去重边 
				g[x][y]=1,p[y]++;
		}
		
		topo();
		for(int i=0;i<ans.size();i++)
		{
			if(i==ans.size()-1)
				cout<<ans[i]<<endl;
			else 
				cout<<ans[i]<<" ";
		}
	}
	return 0;
}
posted @ 2021-07-27 17:28  斯文~  阅读(10)  评论(0)    收藏  举报

你好!