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

    介绍见链接:http://baike.baidu.com/link?url=hA4jA5BlgtJd4ktn_bhjpR8ebKR6N7MYAP7L4oe5H8PL3sJr0XhI8hjpXd4IRw263LBm2vpUtbLFT3NQoSeava

    原理讲解见这篇文章:http://blog.csdn.net/dm_vincent/article/details/7714519

    实现有两种方法:

    一种是从入度出发,代码如下:

     1 #include <iostream>
     2 #include <vector>
     3 #include <queue>
     4 using namespace std;
     5 
     6 vector<pair<int,int> > eg[100];
     7 
     8 typedef pair<int,int> pa;
     9 
    10 //拓扑排序
    11 void topo(int n,int d)
    12 {
    13           queue<int> setOfZeroIndegree;
    14           int degrees[100];
    15           queue<int> result;
    16 
    17           //init
    18           for(int i = 0;i<n;i++)
    19                     degrees[i] = 0;
    20 
    21           //得到每个顶点的入度
    22           for(int i = 0;i<n;i++)
    23           {
    24                     for(int j = 0;j<eg[i].size();j++)
    25                     {
    26                               pa x = eg[i][j];
    27                               degrees[x.first]++;
    28                     }
    29           }
    30 
    31           for(int i = 0;i<n;i++)
    32                     if(degrees[i]==0)
    33                               setOfZeroIndegree.push(i);
    34           int edge = n;
    35           while(!setOfZeroIndegree.empty())
    36           {
    37                     int s = setOfZeroIndegree.front();
    38                     setOfZeroIndegree.pop();
    39                     result.push(s);
    40                     for(int i = 0;i<eg[s].size();i++)
    41                     {
    42                               pa x = eg[s][i];
    43                               degrees[x.first]--;
    44                               edge--;
    45                               if(degrees[x.first]==0)
    46                                         setOfZeroIndegree.push(x.first);
    47                     }
    48           }
    49 
    50           if(edge!=0)
    51           {
    52                     cout<<"There is a circle!
    ";
    53                     return;
    54           }
    55 
    56           while(!result.empty())
    57           {
    58                     int p = result.front();
    59                     result.pop();
    60                     cout<<p<<"->";
    61           }
    62           cout<<endl;
    63 
    64 
    65 
    66 
    67 };
    68 
    69 
    70 int main()
    71 {
    72           int n,d;
    73           cin>>n>>d;
    74           for(int i = 0;i<d;i++)
    75           {
    76                     int t,s,w;
    77                     cin>>t>>s>>w;
    78                     eg[t].push_back(make_pair(s,w));
    79           }
    80           topo(n,d);
    81 
    82 
    83 
    84 }
    85 /*
    86 6 8
    87 0 1 2
    88 0 3 4
    89 1 4 4
    90 2 0 5
    91 2 5 2
    92 3 4 3
    93 3 5 7
    94 5 4 3
    95 */

    还有一种是从出度入手,和DFS非常类似,见DFS算法

  • 相关阅读:
    SpringAOP里JoinPoint常用方法总结
    Hutool工具
    github配置.gitignore忽略版本文件
    IDEA集成Docker部署微服务
    mybatisplus插入报错argument type mismatch
    mysql 主从复制遇到的坑
    博客园文档树参考涉案值
    MySQL分库分表和优化
    mycat中文乱码-解决方案
    ElasticSearch&Docker&Kafka
  • 原文地址:https://www.cnblogs.com/qlky/p/4985793.html
Copyright © 2011-2022 走看看