hduoj------确定比赛名次

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:06   1820   0

拓扑排序结合代码的完整理解




确定比赛名次
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9284 Accepted Submission(s): 3613

Problem Description
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。

Input
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。

Output
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。

Sample Input
4 31 22 34 3

Sample Output
1 2 4 3

Author
SmallBeer(CML)
赤裸裸的拓扑排序.....
代码:
/*@coder Gxjun*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 505
bool map [ maxn ] [ maxn ] ;
int indegree [ maxn ] , tp [ maxn ] , n , m ;
void tuopu_sort ( )
{
memset ( tp , 0 , sizeof ( tp )) ; //
int i , j , k = 0 , ll ;
for ( i = 1 ; i <= n ; i ++ )
{
for ( j = 1 ; j <= n ; j ++ )
{
/*0*/
if ( indegree [ j ] == 0 )
{
indegree [ j ] = -1 ; //-1;
tp [ k ++ ] = j ; //
/**/
for ( ll = 1 ; ll <= n ; ll ++ )
{
if ( map [ j ] [ ll ]) //j-->LL map[j][ll]
{
indegree [ ll ] -- ; //
}
}
break ; //
}
}
if ( j > n )
{
//
return ; //...
}
}
}
int main ( )
{
int i = 0 , fx , ty ; // fx--->from x to y
while ( scanf ( "%d%d" , & n , & m ) != EOF )
{
memset ( map , 0 , sizeof ( map )) ;
memset ( indegree , 0 , sizeof ( indegree )) ;
for ( i = 0 ; i < m ; i ++ )
{
scanf ( "%d%d" , & fx , & ty ) ;
if ( ! map [ fx ] [ ty ]) //
{
map [ fx ] [ ty ] = true ;
indegree [ ty ] ++ ; //
}
}
tuopu_sort ( ) ;
for ( i = 0 ; i < n -1 ; i ++ )
{
printf ( "%d " , tp [ i ]) ;
}
printf ( "%d\n" , tp [ i ]) ;
}
return 0 ;
}
可以结合这个ppt,相信自己保证会....
http://wenku.baidu.com/view/35629a8ad0d233d4b14e69fd.html

转载于:https://www.cnblogs.com/gongxijun/p/3491809.html

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP