每日一题-Day35-寻找图中是否存在有效路径

题目描述

有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。

请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。

给你数组 edges 和整数 nstartend,如果从 start end 存在 有效路径 ,则返回 true,否则返回 false 。

示例

image-20220115104835358

输入:n = 3, edges = [[0,1],[1,2],[2,0]], start = 0, end = 2
输出:true
解释:存在由顶点 0 到顶点 2 的路径:
- 012 
- 02

思路

该题为一个典型的并查集类型,观察示例可以得知,当每个一维数组中存在与另一个一位数组关联的结点时,则该路径是通行,将该二维数组中的一维数组取并集,连接成一个一维数组,若头尾一致则存在路径,

如示例一 edges = [[0,1],[1,2],[2,0]], start = 0, end = 2

取并集后result = [0,1,2,0],前后一致,存在路径

class Solution {

    //定义一个数组
    int result[]; 

    public boolean validPath(int n, int[][] edges, int start, int end) {
        //给数组赋值,大小为图的结点个数
       result = new int[n];
       for (int i = 0; i < n; i++) {
           result[i] = i;
       }
       //将二维数组中的每一个一维数组当成一个集合,连接集合,求并集
       for (int j = 0; j < edges.length; j++) {
           union(edges[j][0], edges[j][1]);
       }
       //如果存在路径,则result的头尾应当都是start元素
       return find(start) == find(end);
    }

    //查找集合中对应元素的方法
    public int find(int a) {
        if (result[a] != a) {
            return find(result[a]);
        }else {
            return a;
        }
    }

    //取数组并集,举例如edges = [[0,1],[1,2],[2,0]],  第一个调用将result[0] = 0, result[1] = 1,第二次调用时,因为edges[1,0] = edgs[0,1] = 1,所以直接返回原数组,不修改
    public void union(int a, int b) {
        int ra = find(a);
        int rb = find(b);
        if(ra == rb){
            return;
        }else {
            result[ra] = rb;
        }
    }
}

题目来自力扣

posted @   2月2日  阅读(272)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示