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 }
  • 相关阅读:
    node
    github
    [模块] pdf转图片-pdf2image
    python 15 自定义模块 随机数 时间模块
    python 14 装饰器
    python 13 内置函数II 匿名函数 闭包
    python 12 生成器 列表推导式 内置函数I
    python 11 函数名 迭代器
    python 10 形参角度 名称空间 加载顺序
    python 09 函数参数初识
  • 原文地址:https://www.cnblogs.com/huangxf/p/4358227.html
Copyright © 2011-2022 走看看