• 27图的拓扑排序


    拓扑排序

    概念:将有向图G的顶点排成一个序列,使得,如果v到w有路,则v排在w之前(注意,并非v排在w之前,v到w就一定有路),拓扑排序所得的顶点序列是图的拓扑序列。

    算法描述

    步骤1)当图中存在入度为0顶点时,循环:

         ①任选一个入度为0的顶点v,输出v

         ②删去v,以及v射出的边

    步骤2)循环终止时,如果已输出全部顶点,就得到一个拓扑序列,否则,表明图中有回路,不存在拓扑序列。

    示例

     

    下面说说人话。。。。。。。。

    拓扑排序步骤:

    1.寻找出最开始的结点(因为是有向图,可以按箭头方向。无向图可任意)。

    2.记住,记录一个点后,与这个点有关的所有边全部删除。如:记录点A后,那么A->B、A->C、A->D之间的边全部删除。

    3.再一次寻找新的开始结点。。。重复以上步骤。。。。。。。。。。。。

    实现方法

    1.图用邻接表存储,表头结点含入度域indegree。

    2.使用一个栈(零度表)存储入度为0的顶点。

    3.当栈不空时循环,从零度表中删除(输出)顶点v,沿v的邻接表L[v],将其邻接点w入度减1(若减到0,w加入零度表)。

    4.使用一个计数器,统计输出的顶点总数。

    拓扑排序算法(伪程序)

    int topological_sort(***)          //“***”表示必要的参数

     {int v,w, count=0;  

       将栈stack置空;

       for(v=0;v<n;v++)    //n是顶点数

         if(L[v].indegree==0)将v推入栈stack中;

       while(栈stack不空)

        {  从栈stack中弹出一个顶点v;

          输出v;  count++;  

          p=L[v].firstarc;

          while(p!=NULL)

            { w=p->adjvex; //<v,w>是一条边

            L[w].indegree--;

            if(L[w].indegree==0)将w推入栈stack中;

            p=p->next;

              }

            }

      if(count<n) return 1;    //有回路

        else  return  0;     //没有回路

       }

  • 相关阅读:
    Linux网络编程“惊群”问题总结
    MySql表结构修改详解
    String和ByteBuffer互转
    Java中String连接性能的分析
    java读取TXT文件的方法
    java文件和文件夹复制、删除、移动操作
    eclipse 导出jar 没有主清单属性的解决方法
    storm集群配置
    storm集群部署和配置过程详解
    Apache Zookeeper 集群环境搭建
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/8509736.html
Copyright © 2020-2023  润新知