• HDU 1285 确定比赛名次(拓扑排序基础)


    题目大意:

      题目是说,给你一个n个节点的有向无环图,然后,对于这个无环图,我们对他进行拓扑排序,使得拓扑排序中的序列按照字典序的方式输出.

    解题思路:

      直接套用toposort()模板。。。

      先说说toposort()的含义:

      拓扑排序就是说,我们在一完成一项工程的时候,这个工程分为了很多的子工程,我们不可能每次都一下完成很多的工程,我们要按照一定事

    务之间的内在联系来完成相应的工程,比如你要完成A工程,那么你必须先完成B工程,所以说B的优先级高于A。那么我们有建图。。

    代码:

     1 # include<cstdio>
     2 # include<iostream>
     3 # include<fstream>
     4 # include<algorithm>
     5 # include<functional>
     6 # include<cstring>
     7 # include<string>
     8 # include<cstdlib>
     9 # include<iomanip>
    10 # include<numeric>
    11 # include<cctype>
    12 # include<cmath>
    13 # include<ctime>
    14 # include<queue>
    15 # include<stack>
    16 # include<list>
    17 # include<set>
    18 # include<map>
    19 
    20 using namespace std;
    21 
    22 const double PI=4.0*atan(1.0);
    23 
    24 typedef long long LL;
    25 typedef unsigned long long ULL;
    26 
    27 # define inf 999999999
    28 # define MAX 521
    29 
    30 int edge[MAX][MAX];//邻接矩阵
    31 int index[MAX];
    32 int book[MAX];
    33 int top;
    34 int n,m;
    35 
    36 
    37 void init()
    38 {
    39     memset(edge,0,sizeof(edge));
    40     for ( int i = 1;i <= n;i++ )
    41     {
    42         index[i] = 0;
    43         book[i] = 0;
    44     }
    45     for ( int i = 0;i < m;i++ )
    46     {
    47         int t1,t2;
    48         scanf("%d %d",&t1,&t2);
    49         if ( edge[t1][t2] == 0 )
    50         {
    51             edge[t1][t2] = 1;
    52             index[t2]++;
    53         }
    54     }
    55 }
    56 
    57 void toposort()
    58 {
    59     int step;
    60     while ( top < n )
    61     {
    62         for ( int i = 1;i <= n;i++ )
    63         {
    64             if ( index[i]==0&&book[i]==0 )
    65             {
    66                 step = i;
    67                 break;
    68             }
    69         }
    70         book[step] = 1;
    71         if ( top )
    72             printf(" ");
    73         printf("%d",step);
    74 
    75         top++;
    76         for ( int j = 1;j <= n;j++ )
    77         {
    78             if ( edge[step][j]==1 )
    79             {
    80                 index[j]--;
    81             }
    82         }
    83 
    84     }
    85     printf("
    ");
    86 }
    87 
    88 int main(void)
    89 {
    90     while ( scanf("%d %d",&n,&m)!=EOF )
    91     {
    92         init();
    93         top = 0;
    94         toposort();
    95     }
    96     
    97     return 0;
    98 }
  • 相关阅读:
    [POI2004] SZP (贪心+拓扑排序)
    【洛谷 P1525】 关押罪犯 (二分图+二分答案)
    【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)
    【洛谷 P4320】 道路相遇 (圆方树,LCA)
    【CF1009F】 Dominant Indices (长链剖分+DP)
    【洛谷 P1707】 刷题比赛 (矩阵加速)
    【洛谷 P4568】 [JLOI2011]飞行路线 (分层最短路)
    【洛谷 P1129】 [ZJOI2007]矩阵游戏 (二分图匹配)
    【CF558E】 A Simple Task (权值线段树)
    【洛谷 P2303】 [SDOi2012]Longge的问题 (欧拉函数)
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4421075.html
Copyright © 2020-2023  润新知