图论~~拓扑排序

xiaoxiao2021-02-28  32

图论~~拓扑排序

在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:

每个顶点出现且只出现一次。若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面

拓扑排序的方法:

       1. 从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。

        2.从图中删除该顶点和所有以它为起点的有向边。

        3.重复以上操作

    图示如下:

首先这是一个有向无环图,即DAG网

第一步我们找出入度为0的点,即A,入队列,,去掉该点以及所有与A点有关的线段,图示如下

第一步我们找出入度为0的点,即B,C,任取一点入队列即可,如B,去掉该点以及所有与B点有关的线段,图示如下

重复以上操作,知道全部的点都入队列,如果有点没有入队列,说明存在环(因为会在遇到环时一个,找不到入度为0的点)

代码如下:

void topusort() { while(!q.empty()) //q 一个队列,保存的是入度为0的点,如果所有入度为0的点都遍历过,就说明找完了 { int t=q.front(); //t 是队首元素 q.pop(); temp[k++]=t; //保存路径 for(int i=0;i<v[t].size();i++) { int t1=v[t][i]; //与入度为0的点相连接的点 count[t1]--; //count[]保存的是每一个点的入度,将与入度为0的点相连的边去掉 if(!count[t1]) //(如果某点的入度为0) q.push(t1); //入队列 } } }

其中代码中的k如果不等于节点数,说明一定存在回路,

并且如果存在好几个入度为0的点,说明排列顺序不唯一,如果让求比赛的结果,则说明比赛的结果不能找出第1,2,3,4,,,,名。

转载请注明原文地址: https://www.6miu.com/read-2614004.html

最新回复(0)