确定比赛名次 最简单的拓朴排序
#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) 编辑 收藏 举报