• 拓扑排序


    自己对拓扑排序的理解:

    例如:安排一些课程的顺序,这些课程有的可以放在一个学期内授课,而有的则有先后顺序,则可以通过拓扑排序来完成这个排序。

    有序无环图(DAG)才能进行拓扑排序。

    从图中找出没有入度顶点,存入答案序列中,并将以该点为起点的边从图中删掉。知道找完所有的点为止。

    图例:(从左往右看)

    第一步:取出1点或者4点,并将对应的边删掉(这里先取1点,具体的顺序根据实际情况来)得

    第二步:再取4点得

    第三步:取2点得到

    最后一步:取出3点来

    答案:1 4 2 3

    还是通过例题来看一下代码实现吧

    确定比赛次序HDU-1285

    PS:注意重边的输入会导致边的入度发生改变这里要做一下处理。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <queue>
     4 #include <stack>
     5 #include <cstdio>
     6 #include <string>
     7 #include <cstring>
     8 #include <sstream>
     9 #include <cmath>
    10 #define INF 0x3f3f3f3f
    11 #define mod 1000000007;
    12 #define FRE() freopen("in.txt","r",stdin)
    13 using namespace std;
    14 const int maxn = 1001;
    15 int mmap[maxn][maxn];
    16 int indegree[maxn];
    17 int n,m;
    18 
    19 inline void init()
    20 {
    21     memset(mmap, 0, sizeof(mmap));
    22     memset(indegree, 0, sizeof(indegree));
    23 }
    24 
    25 void topu()
    26 {
    27     priority_queue<int,vector<int>,greater<int> > que;
    28     for(int i = 1; i <= n; i++)
    29         if(indegree[i] == 0)
    30             que.push(i);
    31 
    32     int cnt = 1;
    33     while(!que.empty())
    34     {
    35         int u = que.top();
    36         que.pop();
    37         if(cnt == 1)
    38         {
    39             printf("%d",u);
    40             cnt++;
    41         }
    42         else
    43             printf(" %d",u);
    44 
    45         for(int i = 1; i <= n; i++)
    46         {
    47             if(mmap[u][i])
    48             {
    49                 indegree[i]--;
    50                 if(indegree[i] == 0)
    51                     que.push(i);
    52             }
    53         }
    54 
    55     }
    56 }
    57 
    58 int main()
    59 {
    60     while(~scanf("%d%d",&n,&m))
    61     {
    62         init();
    63         for(int i = 0; i < m; i++)
    64         {
    65             int st,en;
    66             scanf("%d%d",&st,&en);
    67             if(mmap[st][en]) continue;
    68             mmap[st][en] = 1;
    69             indegree[en]++;
    70         }
    71         topu();
    72         printf("
    ");
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    Hibernate框架做数据库操作
    Spring AOP几个相关术语复习梳理
    Unknown initial character set index '255' received from server...
    使用IDEA的activiti时报错:发现了以元素 'process' 开头的无效内容...
    获取Class实例的4种方式
    maven设置全局和局部jdk版本
    JSP的9大内置对象和4大域对象(作用域)
    oracle中NVL,NVL2,NULLIF,COALESCE等函数
    MIME类型
    Eclipse集成Tomcat,并发布Web工程
  • 原文地址:https://www.cnblogs.com/sykline/p/9737808.html
Copyright © 2020-2023  润新知