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;
}
本文来自博客园,作者:斯文~,转载请注明原文链接:https://www.cnblogs.com/zhiweb/p/15483295.html

浙公网安备 33010602011771号