每日一题-Day35-寻找图中是否存在有效路径
题目描述
有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。
给你数组 edges
和整数 n
、start
和end
,如果从 start
到 end
存在 有效路径 ,则返回 true,否则返回 false 。
示例
输入:n = 3, edges = [[0,1],[1,2],[2,0]], start = 0, end = 2
输出:true
解释:存在由顶点 0 到顶点 2 的路径:
- 0 → 1 → 2
- 0 → 2
思路
该题为一个典型的并查集
类型,观察示例可以得知,当每个一维数组中存在与另一个一位数组关联的结点时,则该路径是通行,将该二维数组中的一维数组取并集,连接成一个一维数组,若头尾一致则存在路径,
如示例一 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;
}
}
}
题目来自力扣
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理