确定比赛名次 最简单的拓朴排序

#include <stdio.h>
#include
<string.h>
#include
<stdlib.h>
#include
<stack>
using namespace std;

int N, M, dp[510], visit[510];

int map[510][510];

int main( )
{
int i, j, a, b, t, flag, k;
while (scanf("%d%d", &N, &M) != EOF) {
flag
= 0;
k
= 0;
stack
<int>q;
memset(dp,
0, sizeof(dp));
memset(visit,
0, sizeof(visit));
memset(map,
0, sizeof(map));
for (i = 1; i <= M; i++) {
scanf(
"%d%d", &a, &b);
if(map[a][b] == 1)
continue;
dp[b]
++;
map[a][b]
= 1;
}
for (i = 1; i <= N; i++)
if(dp[i] == 0) {
q.push(i);
visit[i]
= 1;
break;
}
while (!q.empty( )) {
t
= q.top( );
if(!flag)
printf(
"%d",t),flag = 1;
else
printf(
" %d",t);
q.pop();
for (i = 1; i <= N; i++)
if(map[t][i] == 1)
dp[i]
--;
for (i = 1; i <= N; i++)
if(dp[i] == 0 && !visit[i]) {
q.push(i);
visit[i]
= 1;
break;
}
}
if(flag)
puts(
"");

}
return 0;
}

  

posted on 2011-07-20 11:00  more think, more gains  阅读(253)  评论(0编辑  收藏  举报

导航