首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

算法-图-查找路径

  • 25-02-26 18:40
  • 4088
  • 9605
blog.csdn.net

力扣题目:1971. 寻找图中是否存在路径 - 力扣(LeetCode)

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

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

给你数组 edges 和整数 n、source 和 destination,如果从 source 到 destination 存在 有效路径 ,则返回 true,否则返回 false 。

示例 1:

输入:n = 3, edges = [[0,1],[1,2],[2,0]], source = 0, destination = 2
输出:true
解释:存在由顶点 0 到顶点 2 的路径:
- 0 → 1 → 2 
- 0 → 2

示例 2:

输入:n = 6, edges = [[0,1],[0,2],[3,5],[5,4],[4,3]], source = 0, destination = 5
输出:false
解释:不存在由顶点 0 到顶点 5 的路径.

提示:

  • 1 <= n <= 2 * 10^5
  • 0 <= edges.length <= 2 * 10^5
  • edges[i].length == 2
  • 0 <= ui, vi <= n - 1
  • ui != vi
  • 0 <= source, destination <= n - 1
  • 不存在重复边
  • 不存在指向顶点自身的边

算法如下

  1. package com.dji.sample.accessControlDf;
  2. import java.util.ArrayDeque;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Queue;
  6. public class Solution {
  7. //用DFS深度优先遍历解决,
  8. public boolean validPath(int n, int[][] edges, int source, int destination) {
  9. //标记数组
  10. boolean []flagArr=new boolean[n];
  11. //构造邻接矩阵,内存会超出限制
  12. // int[][] vG=new int [n][n];
  13. // //这样构造需要的存储空间太大了
  14. // for(int i=0;i<edges.length;i++)
  15. // {
  16. // vG[edges[i][0]][edges[i][1]]=1;
  17. // vG[edges[i][1]][edges[i][0]]=1;
  18. // }
  19. List<Integer>[] adj = new List[n];
  20. for (int i = 0; i < n; i++) {
  21. adj[i] = new ArrayList<Integer>();
  22. }
  23. //添加无向图
  24. for (int[] edge : edges) {
  25. int x = edge[0], y = edge[1];
  26. adj[x].add(y);
  27. adj[y].add(x);
  28. }
  29. // dfs dfsSearch(vG,source,flagArr,destination);
  30. //用bfs
  31. //队列存储标记点
  32. Queue<Integer> queue=new ArrayDeque<>();
  33. //出发点入队
  34. queue.offer(source);
  35. // bfsSearch(vG,flagArr,source,destination,queue);
  36. bfs(adj,source,destination,flagArr,queue);
  37. return flagArr[destination];
  38. }
  39. //DFS深度优先递归,内存、时间会超出限制
  40. public void dfsSearch(int [][] vG,int v,boolean[] flagArr,int destination)
  41. {
  42. //节点v被访问
  43. flagArr[v]=true;
  44. //优化:如果访问到目的地结束
  45. if(destination==v)
  46. {
  47. return;
  48. }
  49. for(int i=0;i<vG.length;i++)
  50. {
  51. if(vG[v][i]==1&&flagArr[i]==false)
  52. {
  53. //递归访问邻居节点,如果没有就回退
  54. dfsSearch(vG,i,flagArr,destination);
  55. }
  56. }
  57. }
  58. public void bfsSearch(int[][] vG, boolean[] flagArr,int v, int destination, Queue<Integer> queue)
  59. {
  60. flagArr[v]=true;
  61. while (!queue.isEmpty())
  62. {
  63. //队头出队
  64. int vHead=queue.poll();
  65. //访问队头所在的邻接矩阵
  66. for(int i=0;i<vG.length;i++)
  67. {
  68. if(vG[vHead][i]==1&&flagArr[i]==false)
  69. {
  70. //入队
  71. queue.offer(i);
  72. //标记为访问
  73. flagArr[i]=true;
  74. if(i==destination)
  75. {
  76. return;
  77. }
  78. }
  79. }
  80. }
  81. }
  82. public void bfs(List<Integer>[] adj,int source,int destination,boolean[]flagArr,Queue<Integer> queue )
  83. {
  84. //队头已经被访问
  85. flagArr[source]=true;
  86. while (!queue.isEmpty())
  87. {
  88. //队头出队
  89. int vHead= queue.poll();
  90. //访问队头所在的邻接矩阵
  91. List<Integer> nodeList=adj[vHead];
  92. for(Integer i:nodeList)
  93. {
  94. if(flagArr[i]==false)
  95. {
  96. flagArr[i]=true;
  97. //入队
  98. queue.offer(i);
  99. if(i==destination)
  100. {
  101. return;
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }

注:本文转载自blog.csdn.net的程序员南飞的文章"https://blog.csdn.net/silent702366/article/details/145848253"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top