zoukankan      html  css  js  c++  java
  • hdu 1285 确定比赛名次 拓扑排序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285

    有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
     
    题意描述:如原题所示。
    算法分析:拓扑排序,然后输出上要求合理答案中字典序最小的一个排列。我挫比了,首先想到的是优先队列来处理。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<queue>
     8 #define inf 0x7fffffff
     9 using namespace std;
    10 const int maxn=500+10;
    11 
    12 int n,m;
    13 struct node
    14 {
    15     int u;
    16     friend bool operator < (node a,node b)
    17     {
    18         return a.u > b.u;
    19     }
    20 }cur,tail;
    21 int graph[maxn][maxn],in[maxn];
    22 int an[maxn],cnt;
    23 
    24 void topsort()
    25 {
    26     cnt=0;
    27     priority_queue<node> Q;
    28     for (int i=1 ;i<=n ;i++) if (in[i]==0)
    29     {
    30         cur.u=i;
    31         Q.push(cur);
    32     }
    33     while (!Q.empty())
    34     {
    35         cur=Q.top() ;Q.pop() ;
    36         int u=cur.u;
    37         an[cnt++]=u;
    38         for (int i=1 ;i<=n ;i++)
    39         {
    40             if (graph[u][i] && i!=u)
    41             {
    42                 in[i]--;
    43                 if (in[i]==0)
    44                 {
    45                     cur.u=i;
    46                     Q.push(cur);
    47                 }
    48             }
    49         }
    50     }
    51     int flag=0;
    52     for (int i=0 ;i<cnt ;i++)
    53     {
    54         if (flag) printf(" ");
    55         flag=1;
    56         printf("%d",an[i]);
    57     }
    58     printf("
    ");
    59 }
    60 
    61 int main()
    62 {
    63     while (scanf("%d%d",&n,&m)!=EOF)
    64     {
    65         int a,b;
    66         memset(graph,0,sizeof(graph));
    67         memset(in,0,sizeof(in));
    68         for (int i=1 ;i<=m ;i++)
    69         {
    70             scanf("%d%d",&a,&b);
    71             if (graph[a][b]==0) in[b] ++ ;
    72             graph[a][b]=1;
    73         }
    74         topsort();
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    ContentProvider总结2
    ContentProvider总结
    ContentObserver的使用完整详细示例
    性能优化之Java(Android)代码优化
    联系人数据库contacts2.db介绍
    contact2.db最强详解
    Android Uri、UriMatcher、ContentUris详解
    Android三种ContentResolver查询方式
    Oracle SQL_杂记
    啥是Restful?
  • 原文地址:https://www.cnblogs.com/huangxf/p/4358227.html
Copyright © 2011-2022 走看看