无向DFS遍历

本文介绍了一种使用深度优先搜索(DFS)检测无向图中是否存在环的方法,并提供了一个具体的Java实现示例。该方法通过引入前一个节点的概念来避免重复搜索路径,确保了搜索过程的有效性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无向图的 DFS 要注意避免 “原路返回” 的情况
(1)仅仅依靠设 state = 1 是不行的,所以 dfs 里最好有个参数,代表 “前一个节点”,这样在下一步的搜索中可以直接跳过,又避免了误判有环。
(2)对于起点0,他的pre是-1
public class Solution {
    public boolean validTree(int n, int[][] edges) {
        int[] states = new int[n];
        ArrayList[] graph = new ArrayList[n];

        for(int i = 0; i < n; i++){
            graph[i] = new ArrayList();
        }

        for(int[] edge : edges){
            graph[edge[0]].add(edge[1]);
            graph[edge[1]].add(edge[0]);
        }

        if(hasCycle(-1, 0, states, graph)) return false;

        for(int state : states){
            if(state == 0) return false;
        }

        return true;
    }

    private boolean hasCycle(int prev, int cur, int[] states, ArrayList[] graph){
        states[cur] = 1;
        boolean hasCycle = false;

        for(int i = 0; i < graph[cur].size(); i++){
            int next = (int) graph[cur].get(i);
            if(next != prev){
                if(states[next] == 1) return true;
                else if(states[next] == 0){
                    hasCycle = hasCycle || hasCycle(cur, next, states, graph);
                }
            }

        }

        states[cur] = 2;
        return hasCycle; 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值