有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
n只队伍,每次选一个为0的出队,即排名结束
//hdu 1285 确定比赛名次 A
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
const int N=510;
int vis[N];
vector<int>g[N];
int ans[N];
int degree[N];
int n,m,t;
int main()
{
while(cin>>n>>m)
{
for(int i=1;i<=n;++i)
g[i].clear();
memset(ans,0,sizeof(ans));
memset(degree,0,sizeof(degree));
for(int i=1;i<=m;++i)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
degree[v]++;
}
//cout<<'?'<<endl;
for(int i=1;i<=n;++i)
{
int k=1;
while(degree[k]!=0) k++;
ans[i]=k;
degree[k]=-1;
for(int j=0;j<g[k].size();++j)
degree[g[k][j]]--;
}
for(int i=1;i<n;++i)
cout<<ans[i]<<' ';
cout<<ans[n]<<endl;
}
return 0;
}
//bool dfs(int u)
//{
// vis[u]=-1;
// for(int i=1;i<=n;++i)
// {
// if(g[u][i])
// {
// if(vis[i]==-1) return false;
// else if(!vis[i]&&!dfs(i)) return false;
// }
// }
// vis[u]=1;
// cout<<u<<endl;
// ans[--t]=u;
// return true;
//}
//bool topo_sort()
//{
// t=n;
// memset(vis,0,sizeof(vis));
// for(int u=1;u<=n;++u)
// {
// if(!vis[u])
// {
// if(!dfs(u))
// return false;
// }
// }
// return true;
//}
//int main()
//{
// while(cin>>n>>m)
// {
// memset(g,0,sizeof(g));
// for(int i=1;i<=m;++i)
// {
// int u,v;
// cin>>u>>v;
// g[u][v]=1;
// }
// topo_sort();
// for(int i=1;i<=n;++i)
// {
// if(i==1)
// cout<<ans[i];
// else cout<<' '<<ans[i];
// }
// cout<<endl;
//
// }
//}