确定比赛名次
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31407 Accepted Submission(s): 12374
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
SmallBeer(CML)
过程 :开始不明白一个地方 即找到一个入度为0的点后为什么要break, 而不是继续寻找 。 后来慢慢有些明白 , 毕竟开始顺序从小到大的一种潜在意识, 但不知道自己理解的对不对
思路:本题为拓补排序
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int in[505];///记录各点入度
int maps[505][505];///记录两点间是否打过比赛
int main()
{
int n, m;
while( scanf("%d%d", &n, &m) != EOF )
{
int i, j , k;
int a, b;
for( i = 1; i<=m; i++)
{
scanf("%d%d", &a, &b);
if( maps[a][b] == 0 )///防止一条路记过两次
{
in[b]++;
maps[a][b] = 1;
}
}
int cnt = 0, t;
int out[505] = {0};///用于输出的数组
for( i = 1; i<=n; i++)///n个点 , 需循环n次,
{
for( j = 1; j<=n; j++)
{
if( in[j] == 0)
{
t = j;
in[j] = -1;
out[cnt++] = j;
break;
}
}
for( j =1; j<=n; j++)
{
if( maps[t][j] == 1)
{
maps[t][j] =-1;
in[j]--;///入度-1, 即删除已经加入out数组的点
}
}
}
for( i =0; i<cnt-1; i++)
printf("%d ", out[i]);
printf("%d\n", out[cnt-1]);
memset( maps, 0, sizeof( maps));
memset( in, 0, sizeof( in));
}
return 0;
}