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

    一.概念

      由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

    二.拓扑排序方法如下:
      (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
      (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
      (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

    三.算法实现

      1.普通实现

      

     1 #include<iostream>
     2 #include<stdlib.h>
     3 #include<stdio.h>
     4 #define MAX 100
     5 using namespace std;
     6 
     7 void toposort(int map[MAX][MAX],int indegree[MAX],int n)
     8 {
     9     int i,j,k;
    10     for(i=0;i<n;i++)           //遍历n次
    11     {
    12         for(j=0;j<n;j++)      //找出入度为0的节点
    13          {
    14             if(indegree[j]==0)
    15             {
    16                 indegree[j]--;
    17                 cout<<j<<endl;
    18                 for(k=0;k<n;k++)    //删除与该节点关联的边
    19                   {
    20                     if(map[j][k]==1)
    21                     {
    22                         indegree[k]--;
    23                     }
    24                 }
    25                 break;
    26             }
    27         }
    28     }
    29 }
    30 
    31 
    32 int main(void)
    33 {
    34     int n,m;           //n:关联的边数,m:节点数
    35     while(scanf("%d %d",&n,&m)==2&&n!=0)
    36     {
    37         int i;
    38         int x,y;
    39         int map[MAX][MAX];//邻接矩阵
    40         int indegree[MAX];//入度
    41         memset(map,0,sizeof(map));
    42         memset(indegree,0,sizeof(indegree));
    43         for(i=0;i<n;i++)
    44         {
    45             scanf("%d %d",&x,&y);
    46             if(!map[x][y])//防止入度重复加 
    47             {
    48                 map[x][y]=1;
    49                 indegree[y]++;
    50             }
    51         }
    52         toposort(map,indegree,m);
    53     }
    54     //while(1);
    55     return 0;
    56 }
    57 
    58 
    59 //http://www.cnblogs.com/dolphin0520/archive/2011/04/16/2017737.html

      2.递归实现

     1 int c[maxn];
     2 int topo[maxn],t;
     3 
     4 bool dfs(int u)
     5 {
     6    c[u]=-1;//正在访问该顶点
     7    for(int v=0; v<n; v++)
     8    {
     9        if(G[u][v]==1)
    10        {
    11             if(c[v]<0) return false;//存在环   
    12             //c[v]=-1代表正在访问该定点(即递归调用dfs(u)正在帧栈中,尚未返回)
    13             else if(!c[v] && !dfs(v))   return false;   
    14             //(c[v]==0 && dfs(v)==false即当前顶点没有后继顶点时
    15 
    16        }
    17    }
    18 
    19    c[u]=1;      //访问结束
    20    topo[--t]=u;
    21    return true;
    22 }
    23 
    24 bool toposort()
    25 {
    26     t=n;    
    27     memset(c,0,sizeof(c));
    28         
    29     for(int u=0; u<n; u++)    
    30         if(!c[u]) 
    31             if(!dfs())  
    32                 return false;    
    33     return ture;
    34 }
  • 相关阅读:
    log4j2分析总结(一)
    Idea(三)常用插件以及快捷键总结
    设计模式(七)_模板方法模式
    Idea(二) 解决IDEA卡顿问题及相关基本配置
    设计模式(六)_观察者模式
    SpringBoot(十一)_springboot热部署
    UML类图学习
    设计模式(五)_工厂方法模式
    设计模式(四)_简单工厂模式
    设计模式(三)_装饰器模式
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3003834.html
Copyright © 2011-2022 走看看