//没有自环
function dfs(v,G){
//if(hasCycle)return
marked[v]=true
onStack[v]=true
for(let j in G[v]){
//自己写的代码放在最上面,书上放这里,考虑到大部分时间在这个循环里,写这里更快
if(hasCycle)return
let w=G[v][j]
if(!marked[w]){
from[w]=v
dfs(w,G)
}else if(onStack[w]){
hasCycle=true
console.log(getPath(w,v,from))
}
}
onStack[v]=false
}
function getPath(s,v,from){
var path=[v]
while(v!=s){
//console.log(s,v,from)
v=from[v]
path.unshift(v)
}
path.push(s)
return path
}
let generateDirectedGraph=require("./graph").generateDirectedGraph
let V=20
var edges=[]
for(let i=0;i<V*2;i++){
let x=Math.floor(Math.random()*V)
let y=Math.floor(Math.random()*V)
edges.push([x,y])
}
console.log(G=generateDirectedGraph(V,edges,false))
var marked=[]
var onStack=[]
for(let i=0;i<V;i++){
marked[i]=false
onStack[i]=false
}
var hasCycle=false
var from=[]
var start=0
dfs(start,G)
console.log(hasCycle)
js版本判断有向图是否有环并找出环
最新推荐文章于 2023-09-03 22:21:49 发布