zoukankan      html  css  js  c++  java
  • *HDU1285 拓扑排序

    确定比赛名次

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 23336    Accepted Submission(s): 9441


    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
     
    代码:
     1 //拓扑排序。像本题这样的排序就叫拓扑排序。本题要字典序小的在前所以用优先队列存。
     2 //用一个vector数组保存他们之间的关系,in数字记录每个元素的入度,入度为零的排在最前面,每次将入度为零的一层元素扫一遍
     3 //找有没有只有一个入度的一个儿子(只从他这边过去),如果有就将儿子加入队列,没有就减去一次入度。直到最后如果还有没入队列的就说明存在环。
     4 #include<iostream>
     5 #include<cstdio>
     6 #include<cstring>
     7 #include<vector>
     8 #include<queue>
     9 #include<functional>
    10 using namespace std;
    11 int ans[505];
    12 vector<int>g[505];
    13 int in[505];
    14 int n,m,cnt;
    15 void topo()
    16 {
    17     priority_queue<int,vector<int>,greater<int> >q;
    18     cnt=0;
    19     for(int i=1;i<=n;i++)
    20     if(in[i]==0)
    21     q.push(i);
    22     while(!q.empty())
    23     {
    24         int a=q.top();
    25         q.pop();
    26         ans[++cnt]=a;
    27         for(int i=0;i<g[a].size();i++)
    28         {
    29             int b=g[a][i];
    30             if(--in[b]==0)
    31             q.push(b);
    32         }
    33     }
    34 }
    35 int main()
    36 {
    37     int a,b;
    38     while(scanf("%d%d",&n,&m)!=EOF)
    39     {
    40         for(int i=0;i<=n;i++)
    41         {
    42             g[i].clear();
    43             in[i]=0;
    44         }
    45         for(int i=0;i<m;i++)
    46         {
    47             scanf("%d%d",&a,&b);
    48             g[a].push_back(b);
    49             in[b]++;
    50         }
    51         topo();
    52        // if(cnt<n) printf("有环不能拓扑排序");
    53         for(int i=1;i<cnt;i++)
    54         printf("%d ",ans[i]);
    55         printf("%d
    ",ans[cnt]);
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    Python 中的map函数,filter函数,reduce函数
    编程中,static的用法详解
    C++ list容器系列功能函数详解
    python中的configparser类
    310实验室OTL问题----将写好的C++文件转换成Python文件,并将数据可视化
    310实验室OTL问题
    常量指针、指针常量、指向常量的指针常量
    Iterator迭代器的相关问题
    struts2中action中的通配符
    struts2访问servlet API
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/6032593.html
Copyright © 2011-2022 走看看