简单的拓扑排序裸题
确定比赛名次
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAX=510;
int Map[MAX][MAX];
int vis[MAX];
int win[MAX];
int a[MAX];
int main()
{
int i,n,m,j,k,l,p,q,s;
while(~scanf("%d%d",&n,&m))
{
memset(Map,0,sizeof(Map));
memset(vis,0,sizeof(vis));
memset(win,0,sizeof(win));
memset(a,0,sizeof(a));
s=0;
for(i=1;i<=m;i++)
{
scanf("%d%d",&j,&k);
if(Map[j][k]==0)
{
Map[j][k]=1;
win[k]++;
}
}
for(q=1;q<=n;q++)//重复寻找win[p]=0的元素
for(p=1;p<=n;p++)
{
if(win[p]==0&&vis[p]==0)
{
a[s]=p;s++;
vis[p]=1;
for(l=1;l<=n;l++)
{
if(Map[p][l]==1)
win[l]--;
}
break;
}
}
for(s=0;s<=n-1;s++)
{
if(s==0)printf("%d",a[s]);
else printf(" %d",a[s]);
}
printf("\n");
}
}