js版本判断有向图是否有环并找出环

//没有自环
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)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值