竹子听

杂:补充知识点

哈密顿图:是无向图中,从一个节点可以一次经过且只经过一次图中所有的节点,这样的图叫做哈密顿图。
哈密顿回路的条件是:1.是一个封闭的图形 2.任意一对节点之间皆可达。

经过图(有向图或无向图)中所有顶点一次且仅一次的通路称为哈密顿通路。
[任意一点都满足]经过图中所有顶点一次且仅一次的回路称为哈密顿回路。
具有哈密顿回路的图称为哈密顿图,具有哈密顿通路但不具有哈密顿回路的图称为半哈密顿图。
平凡图是哈密顿图。

 

拓扑排序
  定义:在一个有向图中,对于任意一对点如果存在u到v的路径,那么在拓扑排序后u一定在v前面。 
  偏序/全序
 偏序:任意两个之间要么是确定关系,某某在某某之前;要么是不确定关系,【一定不存在矛盾关系】(即环路,所以强调无环)
 全序:在偏序的基础上,满足任意两点之间的关系是确定的。
  ++一个图能被拓扑排序的充要条件是它!是!一!个!有向!无环!图!
  拓扑排序唯一性的条件是,所有节点都有全序关系。


【一】无前趋的顶点优先的拓扑排序方法  

  该方法的每一步总是输出当前无前趋(即人度为零)的顶点,其抽象算法可描述为:
        NonPreFirstTopSort(G){//优先输出无前趋的顶点
            while(G中有人度为0的顶点)do{
              从G中选择一个人度为0的顶点v且输出之;
             从G中删去v及其所有出边;
             }
             if(输出的顶点数目<|V(G)|)
                  //若此条件不成立,则表示所有顶点均已输出,排序成功。
             Error("G中存在有向环,排序失败!");
         }
注意:
     无前趋的顶点优先的拓扑排序算法在具体存储结构下,为便于考察每个顶点的人度,可保存各顶点当前的人度。为避免每次选入度为0的顶点时扫描整个存储空

间,可设一个栈或队列暂存所有入度为零的顶点:
     在开始排序前,扫描对应的存储空间,将人度为零的顶点均入栈(队)。以后每次选人度为零的顶点时,只需做出栈(队)操作即可。
【二】同理,还有无后继顶点优先的拓扑排序
【三】算法求精
     在对该算法求精时,可用逆邻接表作为G的存储结构。设置一个向量outdegree[0..n-1]或在逆邻接表的顶点表结点中增加1个出度域来保存各顶点当前的出度;

设置一个栈或队列来暂存所有出度为零的顶点。除了增加一个栈或向量T来保存输出的顶点序列外,该算法完全类似于NonPreFirstTopSort。
ps:woc逆邻接表出度域这么low的你管它叫优化?!
【四】利用深度优先遍历对DAG拓扑排序  

  当从某顶点v出发的DFS搜索完成时,v的所有后继必定均已被访问过(想像它们均已被删除),此时的v相当于是无后继的顶点,因此在DFS算法返回之前输出顶点v

即可得到 DAG的逆拓扑序列。
    其中第一个输出的顶点必是无后继(出度为0)的顶点,它应是拓扑序列的最后一个顶点。若希望得到的不是逆拓扑序列,同样可增加T来保存输出的顶点。若假设

T是栈,并在DFSTraverse算法的开始处将T初始化,
    利用DFS求拓扑序列的抽象算法可描述为:
      void DFSTopSort(G,i,T){
         //在DisTraverse中调用此算法,i是搜索的出发点,T是栈
        int j;
        visited[i]=TRUE; //访问i
         for(所有i的邻接点j)//即<i,j>∈E(G)
           if(!visited[j])
            DFSTopSort(G,j,T);
           //以上语句完全类似于DFS算法
          Push(&T,i); //从i出发的搜索已完成,输出i
         }
    只要将深度优先遍历算法DFSTraverse中对DFS的调用改为对DFSTopSort的调用,即可求得拓扑序列T。其具体算法不难从上述抽象算法求精后得到。
   若C中存在有向环,则不能正常工作。 

 

评论(1)

热度(1)