题目描述:设G=(V, E)是有向图,请给出算法,判断G中是否有回路,并要求算法的复杂性为O(n+e),其中n = | V |,e = | E |。(10.0分)
下面是对判断算法的ADL语言描述:
算法Judge_loop(Head , ans )
/遍历图查看是否有回路/
Jl1. [初始化]
ans=false.
/计算 count 数组/
FOR i=1 TO n DO count[i] <- 0;
FOR i=1 TO n DO
( p <- adjacent(Head[i]).
WHILE p≠^ DO
(count[VerAdj(p)] <- count[VerAdj(p)] + 1.
p <- link(p)))
top <- -1.
FOR i=1 TO n DO
IF count[i] =0 THEN
(count[i] <- top. Top <- i.)
Jl2.[判断是否有回路]
FOR i=1 TO n DO
/若循环体尚未被执行n次,栈顶指针已为-1,说明有回路,终止程序/
IF top=-1 THEN ans=true.
ELSE
(j <- top.
top <- count[top].
p<-adjacent(Head[i]).
WHILE p≠^ DO
(k <- VerAdj(p).
count[k] <- count[k]-1.
IF count[k] = 0 THEN
(count[k] <- top. Top <- k.)
p <- link(p))) ▌