环路检测的大规模计算

环路检测的描述和种类

环路检测是计算图中是否有环,即如果从一个顶点出发,沿着出边一直走,能再走到这个顶点。

环路检测的种类

  1. 单点出发的环路存在检测
    单点出发的环路存在检测是检测一个点(u)是否在某个环路内。计算过程,是从点(u)出发,沿着出边走,如果能再走到(u),则
  2. 检查经过某点(u)的所有环路。
    经过某个顶点的所有环路,要求环路都是简单环(即路径是u->v1->v2->…->vn->u. v1,v2,…,vn顶点只能出现一次)。
  3. 整个图是否有环
    从所有点出发,找到任何一个环退出。
  4. 找到图中所有的环。

找到图中所有的环的计算方法

在每一轮计算过程中,每个活动顶点沿着出边发送顶点序列组成的一个集合。在第一轮,每个顶点v沿着出边给所有邻接顶点发送(v)。在下一次迭代时,每个活动顶点v 把收到的所有顶点序列加上本节点v,还是沿着出边给所有邻接顶点。如果顶点v没有收到任何信息,则顶点v把自己变成不活动。当所有的顶点都变成不活动时,计算结束。

对于顶点v收到的每个顶点序列 ( v 1 ; v 2 ; . . . ; v k ) (v_1;v_2;...;v_k) (v1;v2;...;vk),增加了本顶点的序列在两种情况下不在发送。1),如果v = v1,那么检测出一个环路。2)如果 v = v i v=v_i v=vi i ∈ 2 , 3 , . . . , k i\in{2, 3, ..., k} i2,3,...,k;表明v已经检测出环路(v = v_i, v_{i+1},…,v_k,v_{k+1} = v);在这种情况下,这个序列也丢掉,因为这个环路肯定在前几轮检测出来了。。准确的说,这个环路肯定已经在 k − i + 1 k-i+1 ki+1次迭代时被检测出来。每个环路 ( v 1 , v 2 , . . . , v k , v k + 1 = v 1 ) (v_1, v_2,...,v_k,v_{k+1}=v_1) (v1,v2,...,vk,vk+1=v1)被所有的 v i , i = 1 v_i, i=1 vi,i=1 to k k k顶点在同一迭代时被检测出来。会被顶点为最小的 m i n { v 1 , . . . , v k } min\{v_1,...,v_k\} min{ v1,...,vk} 输出,其余顶点丢弃。

本算法的最大迭代次数由图中的最长的路径决定。


论文:环路检测大规模计算

猜你喜欢

转载自blog.csdn.net/houzhizhen/article/details/107934838