トピックリンク
http://acm.hdu.edu.cn/showproblem.php?pid=1285
アイデア
各ゲームの結果は、勝者側から敗者側までの有向グラフと見なすことができます。この有向グラフのインディグリーが0である点は、ランキングが決定できない最も外側の点であり、次のようになります。小さいものから小さいものへの数値。大きなソートでは、これらのポイントをansに保存し、これらのポイントのすべての次数をクリアしてから、次のレイヤーを確認します。これは実際にはトポロジカルソートですが、次のことを確認する必要があります。ランキングは一意ではありません。チームの数が少ない場合は、優先キューを使用してこのトポロジカル順序を維持できます。詳細については、コードを参照してください。
コード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 5e2+10;
int n,m;
int du[N];
vector<int> E[N];
void topsort(){
vector<int> ans;
priority_queue<int,vector<int>,greater<int> > que;
for(int i = 1;i <= n; ++i)
if(!du[i]) que.push(i);
while(!que.empty()){
int t = que.top();
que.pop();
ans.push_back(t);
for(int i = 0,l = E[t].size();i < l; ++i) {
int v = E[t][i];
du[v]--;
if(!du[v]) que.push(v);
}
}
for(int i = 0;i < n; ++i)
cout<<ans[i]<<" \n"[i == n-1];
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
while(cin>>n>>m){
for(int i = 0;i <= n; ++i)
E[i].clear(),du[i] = 0;
int u,v;
for(int i = 1;i <= m; ++i) {
cin>>u>>v;
du[v]++;
E[u].push_back(v);
}
topsort();
}
return 0;
}