zoukankan      html  css  js  c++  java
  • topo排序 + 用邻接表优化后的

    输入数据:

    4 6
    1 2
    1 3
    2 3
    3 4
    2 4
    4 2

    4 6
    1 2
    1 3
    2 3
    3 4
    2 4
    1 2

    topo排序为偏序:

     1 #include<stdio.h>
     2 #include<queue>
     3 #include<string.h>
     4 using namespace std;
     5 int indegree[100] ;
     6 queue<int>q;
     7 int n , m ;
     8 bool map[100][100] ;
     9 int a[100] ;
    10 int topo(int n)
    11 {
    12     int cnt = 0 ;
    13     while (!q.empty ())
    14         q.pop () ;
    15 
    16     for(int i = 1 ; i <= n ; i++) {
    17         if (indegree[i] == 0) {
    18             q.push(i);//入度为0的点为起始点
    19         }
    20     }
    21 
    22     int temp ;
    23     while(!q.empty()) {
    24         temp = q.front();
    25         a[cnt ++] = temp ;
    26         q.pop();
    27         for(int i = 1 ; i <= n ; i++) {
    28             if(map[temp][i]) {
    29                 indegree[i]--;
    30                 if(indegree[i] == 0)
    31                     q.push(i);
    32             }
    33         }
    34     }
    35     if (cnt == n) //当输出的顶点数小于图中的顶点数时,输出有回路信息
    36         for (int i = 0 ; i < n ; i++) {
    37             printf ("%d----->" , a[i]) ;
    38     }
    39     else
    40         puts ("The network has a cycle!") ;
    41 }
    42 
    43 int main ()
    44 {
    45    // freopen ("a.txt" , "r" , stdin) ;
    46     int u , v ;
    47     while (~ scanf ("%d%d" , &n , &m)) {
    48         memset (indegree , 0 , sizeof(indegree)) ;
    49         memset (map , 0 , sizeof(map)) ;
    50         for (int i = 0 ; i < m ; i++) {
    51             scanf ("%d%d" , &u , &v) ;
    52             if (!map[u][v])//在u 和 v 没有连通时
    53                 indegree[v]++ ;//点v的入度++
    54             map[u][v] = 1 ;//表示连通
    55         }
    56         topo (n) ;
    57     }
    58 }
    View Code

    演示:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/topological_sort.asp

    详细:http://blog.csdn.net/dm_vincent/article/details/7714519

     1 -----------------hash table------------------------------------
     2 struct Hash
     3 {
     4     int nxt ;
     5     ll w ;
     6     Hash () {}
     7     Hash (int nxt , ll w) : nxt (nxt) , w (w) {}
     8 }e[M];
     9 int H[M] , E ;
    10 
    11 void init ()
    12 {
    13     E = 0 ;
    14     memset (H , 0 , sizeof(H) ) ;
    15 }
    16 
    17 void Insert (ll x)
    18 {
    19     int y = x % M ;
    20     if (y < 0) y += M ;
    21     e[E ++] = (H[y] , x) ;
    22     H[y] = E ;
    23 }
    24 
    25 bool Find (ll x)
    26 {
    27     int y = x % M ;
    28     if (y < 0) y += M ;
    29     for (int i = H[y] ; i ; i = e[i].nxt) {
    30         if (e[i].w == x) return true ;
    31     }
    32     return false ;
    33 }
    34 ------------------邻接表--------------------------------------------------------
    35 struct edge
    36 {
    37     int u , v , w , nxt ;
    38     edge () {}
    39     edge (int u , int v , int w , int nxt) : u (u) , v (v) , w (w) , nxt (nxt) {}
    40 }e[M];
    41 int H[M] , E ;
    42 void init ()
    43 {
    44     memset (H , 0 , sizeof(H) ) ;
    45     E = 0 ;
    46 }
    47 
    48 void addedge ()
    49 {
    50     e[E ] = edge (u , v , w , H[u]) ;
    51     H[u] = E ++;
    52     e[E ] = edge (v , u , w , H[v]) ;
    53     H[v] = E ++;
    54 }
    View Code

    用邻接表优化后的。时间,空间复杂度都降为O(N)

  • 相关阅读:
    7个简单但棘手的JavaScript面试问题
    Promise.then链式调用顺序
    JS模拟实现枚举
    web前端常见的加密算法介绍
    JavaScript浮点数精度
    工作中常用的JavaScript函数片段
    JavaScript Array (数组) 对象
    快速找出数组中是否包含公共项
    用JavaScript让你的浏览器说话
    JavaScript的声明提升
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4314318.html
Copyright © 2011-2022 走看看