您的位置:首页 > 其它

hdu 1285 确定比赛名次(拓扑排序)

2015-04-06 16:59 127 查看

确定比赛名次

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 14353 Accepted Submission(s): 5738



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 3
1 2
2 3
4 3




Sample Output
1 2 4 3




Author
SmallBeer(CML)


Source
杭电ACM集训队训练赛(VII)

题目分析:拓扑排序

#include <iostream>
#include <set>
#include <vector>
#include <memory.h>

using namespace std;

bool mp[505][505] ;
int in[505] ;

int main ( )
{

        int n,m;
        while (  cin >> n >> m )
        {
             memset ( in , 0 ,  sizeof ( in ) );
             memset ( mp , 0 , sizeof ( mp) );
          int temp1 , temp2;
        for ( int i = 0 ; i < m ; i++ )
        {
            cin >>temp1 >> temp2;
            if ( !mp[temp1][temp2]  )
            {
                    mp[temp1][temp2] = 1;
                    in[temp2]++;
            }
        }
        vector<int>  ans;
        set<int> s;
        for ( int i  = 1 ; i<= n ; i++  )
            if ( in[i] == 0 )  s.insert ( i );
        while ( !s.empty () )
        {
            ans.push_back (  *s.begin () );
            int temp = *s.begin ();
            s.erase ( s.begin () );
            for ( int i = 1 ; i <= n ; i++ )
                    if ( mp[temp][i] == 1 )
                        if ( --in[ i] == 0 )  s.insert ( i );
         }
         bool flag = false;
        for ( int i = 0 ;i < ans.size () ; i++ )
        {
                    if ( flag )  cout << " ";
                    cout << ans[i] ;
                    flag = true;
        }
                cout << endl;
        }
        return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: