mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
@ -8,26 +8,24 @@
|
|||||||
|
|
||||||
[题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/)
|
[题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/)
|
||||||
|
|
||||||
有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
|
有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
|
||||||
|
|
||||||
请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。
|
请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。
|
||||||
|
|
||||||
给你数组 edges 和整数 n、start和end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。
|
给你数组 edges 和整数 n、start 和 end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
提示:
|
提示:
|
||||||
|
|
||||||
* 1 <= n <= 2 * 10^5
|
- 1 <= n <= 2 \* 10^5
|
||||||
* 0 <= edges.length <= 2 * 10^5
|
- 0 <= edges.length <= 2 \* 10^5
|
||||||
* edges[i].length == 2
|
- edges[i].length == 2
|
||||||
* 0 <= ui, vi <= n - 1
|
- 0 <= ui, vi <= n - 1
|
||||||
* ui != vi
|
- ui != vi
|
||||||
* 0 <= start, end <= n - 1
|
- 0 <= start, end <= n - 1
|
||||||
* 不存在双向边
|
- 不存在双向边
|
||||||
* 不存在指向顶点自身的边
|
- 不存在指向顶点自身的边
|
||||||
|
|
||||||
## 思路
|
## 思路
|
||||||
|
|
||||||
@ -70,7 +68,7 @@ void join(int u, int v) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
以上模板中,只要修改 n 大小就可以,本题n不会超过2 * 10^5。
|
以上模板中,只要修改 n 大小就可以,本题 n 不会超过 2 \* 10^5。
|
||||||
|
|
||||||
并查集主要有三个功能。
|
并查集主要有三个功能。
|
||||||
|
|
||||||
@ -86,7 +84,7 @@ void join(int u, int v) {
|
|||||||
|
|
||||||
此时我们就可以直接套用并查集模板。
|
此时我们就可以直接套用并查集模板。
|
||||||
|
|
||||||
使用join(int u, int v)将每条边加入到并查集。
|
使用 join(int u, int v)将每条边加入到并查集。
|
||||||
|
|
||||||
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
|
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
|
||||||
|
|
||||||
@ -191,7 +189,7 @@ class Solution {
|
|||||||
|
|
||||||
### Python:
|
### Python:
|
||||||
|
|
||||||
PYTHON并查集解法如下:
|
PYTHON 并查集解法如下:
|
||||||
|
|
||||||
```PYTHON
|
```PYTHON
|
||||||
class Solution:
|
class Solution:
|
||||||
@ -206,6 +204,85 @@ class Solution:
|
|||||||
return find(source) == find(destination)
|
return find(source) == find(destination)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Javascript:
|
||||||
|
|
||||||
|
Javascript 并查集解法如下:
|
||||||
|
|
||||||
|
```Javascript
|
||||||
|
class unionF{
|
||||||
|
constructor(n){
|
||||||
|
this.count = n
|
||||||
|
this.roots = new Array(n).fill(0).map((item,index)=>index)
|
||||||
|
}
|
||||||
|
|
||||||
|
findRoot(x){
|
||||||
|
if(this.roots[x]!==x){
|
||||||
|
this.roots[x] = this.findRoot(this.roots[x])
|
||||||
|
}
|
||||||
|
return this.roots[x]
|
||||||
|
}
|
||||||
|
|
||||||
|
union(x,y){
|
||||||
|
const rx = this.findRoot(x)
|
||||||
|
const ry = this.findRoot(y)
|
||||||
|
this.roots[rx] = ry
|
||||||
|
this.count--
|
||||||
|
}
|
||||||
|
|
||||||
|
isConnected(x,y){
|
||||||
|
return this.findRoot(x)===this.findRoot(y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var validPath = function(n, edges, source, destination) {
|
||||||
|
const UF = new unionF(n)
|
||||||
|
for(const [s,t] of edges){
|
||||||
|
UF.union(s,t)
|
||||||
|
}
|
||||||
|
return UF.isConnected(source,destination)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Javascript 双向 bfs 解法如下:
|
||||||
|
|
||||||
|
```Javascript
|
||||||
|
var validPath = function(n, edges, source, destination) {
|
||||||
|
const graph = new Array(n).fill(0).map(()=>[])
|
||||||
|
for(const [s,t] of edges){
|
||||||
|
graph[s].push(t)
|
||||||
|
graph[t].push(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
const visited = new Array(n).fill(false)
|
||||||
|
function bfs(start,end,graph){
|
||||||
|
const startq = [start]
|
||||||
|
const endq = [end]
|
||||||
|
while(startq.length&&endq.length){
|
||||||
|
const slen = startq.length
|
||||||
|
for(let i = 0;i<slen;i++){
|
||||||
|
const scur = startq.shift()
|
||||||
|
if(visited[scur]) continue
|
||||||
|
if(endq.includes(scur)) return true
|
||||||
|
visited[scur] = true
|
||||||
|
const neighbors = graph[scur]
|
||||||
|
startq.push(...neighbors)
|
||||||
|
}
|
||||||
|
|
||||||
|
const elen = endq.length
|
||||||
|
for(let i = 0;i<elen;i++){
|
||||||
|
const ecur = endq.shift()
|
||||||
|
if(visited[ecur]) continue
|
||||||
|
if(startq.includes(ecur)) return true
|
||||||
|
visited[ecur] = true
|
||||||
|
const neighbors = graph[ecur]
|
||||||
|
endq.push(...neighbors)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return bfs(source,destination,graph)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
Reference in New Issue
Block a user