不想说什么。都快要被坑哭了。。。感谢hdu里面的discuss。
有重边。
还有必须以赢家为起点,输家为终点。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
const int SIZE = 505;
int ma[SIZE][SIZE];
int indegree[SIZE];
int res[SIZE],mark[SIZE];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int win,lose;
memset(indegree,0,sizeof(indegree));
memset(mark,0,sizeof(mark));
memset(ma,0,sizeof(ma));
for(int i = 0;i < m;i++)
{
scanf("%d%d",&win,&lose);
if(ma[win][lose] == 0)
{
indegree[lose] ++;
ma[win][lose] = 1;
}
}
for(int i = 0;i < n;i++)
{
int tmp;
for(int j = 1;j <= n;j++)
{
if(indegree[j] == 0&&!mark[j])
{
tmp = j;
mark[j] = 1;
break;
}
}
for(int j = 1;j <= n;j++)
{
if(ma[tmp][j] == 1)
{
ma[tmp][j] = 0;
indegree[j] --;
}
}
res[i] = tmp;
}
for(int i = 0;i < n;i++)
printf("%d%c",res[i],i == n-1?'\n':' ');
}
return 0;
}