Skip to content

Commit 908da36

Browse files
committed
Added Leetcode 1971
1 parent c6e59f9 commit 908da36

File tree

4 files changed

+181
-0
lines changed

4 files changed

+181
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include <vector>
2+
#include <unordered_map>
3+
#include <unordered_set>
4+
5+
using namespace std;
6+
7+
class Solution {
8+
public:
9+
bool validPath(int n, vector<vector<int>>& edges, int source, int destination) {
10+
if (source == destination) return true;
11+
12+
unordered_map<int, vector<int>> graph;
13+
for (const auto& edge : edges) {
14+
graph[edge[0]].push_back(edge[1]);
15+
graph[edge[1]].push_back(edge[0]);
16+
}
17+
18+
unordered_set<int> seen;
19+
seen.insert(source);
20+
21+
return dfs(source, destination, graph, seen);
22+
}
23+
24+
private:
25+
bool dfs(int node, int destination, unordered_map<int, vector<int>>& graph, unordered_set<int>& seen) {
26+
if (node == destination) return true;
27+
28+
for (int neighbor : graph[node]) {
29+
if (seen.find(neighbor) == seen.end()) {
30+
seen.insert(neighbor);
31+
if (dfs(neighbor, destination, graph, seen)) return true;
32+
}
33+
}
34+
return false;
35+
}
36+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Recurisve DFS
2+
3+
import java.util.*;
4+
5+
public class Solution {
6+
public boolean validPath(int n, int[][] edges, int source, int destination) {
7+
if (source == destination) return true;
8+
9+
Map<Integer, List<Integer>> graph = new HashMap<>();
10+
for (int[] edge : edges) {
11+
graph.computeIfAbsent(edge[0], k -> new ArrayList<>()).add(edge[1]);
12+
graph.computeIfAbsent(edge[1], k -> new ArrayList<>()).add(edge[0]);
13+
}
14+
15+
Set<Integer> seen = new HashSet<>();
16+
seen.add(source);
17+
18+
return dfs(source, destination, graph, seen);
19+
}
20+
21+
private boolean dfs(int node, int destination, Map<Integer, List<Integer>> graph, Set<Integer> seen) {
22+
if (node == destination) return true;
23+
24+
for (int neighbor : graph.getOrDefault(node, Collections.emptyList())) {
25+
if (!seen.contains(neighbor)) {
26+
seen.add(neighbor);
27+
if (dfs(neighbor, destination, graph, seen)) return true;
28+
}
29+
}
30+
return false;
31+
}
32+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var validPath = function(n, edges, source, destination) {
2+
if (source === destination) return true;
3+
4+
const graph = new Map();
5+
for (const [u, v] of edges) {
6+
if (!graph.has(u)) graph.set(u, []);
7+
if (!graph.has(v)) graph.set(v, []);
8+
graph.get(u).push(v);
9+
graph.get(v).push(u);
10+
}
11+
12+
const seen = new Set();
13+
seen.add(source);
14+
15+
const dfs = (node) => {
16+
if (node === destination) return true;
17+
18+
for (const neighbor of graph.get(node) || []) {
19+
if (!seen.has(neighbor)) {
20+
seen.add(neighbor);
21+
if (dfs(neighbor)) return true;
22+
}
23+
}
24+
return false;
25+
};
26+
27+
return dfs(source);
28+
}
29+
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# Recursive DFS
2+
class Solution:
3+
def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
4+
if source == destination:
5+
return True
6+
7+
graph = defaultdict(list)
8+
for u, v in edges:
9+
graph[u].append(v)
10+
graph[v].append(u)
11+
12+
seen = set()
13+
seen.add(source)
14+
15+
def dfs(i):
16+
if i == destination:
17+
return True
18+
19+
for nei_node in graph[i]:
20+
if nei_node not in seen:
21+
seen.add(nei_node)
22+
if dfs(nei_node):
23+
return True
24+
25+
return False
26+
27+
return dfs(source)
28+
29+
30+
# Iterative DFS with Stack
31+
class Solution:
32+
def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
33+
if source == destination:
34+
return True
35+
36+
graph = defaultdict(list)
37+
for u, v in edges:
38+
graph[u].append(v)
39+
graph[v].append(u)
40+
41+
seen = set()
42+
seen.add(source)
43+
stack = [source]
44+
45+
while stack:
46+
node = stack.pop()
47+
if node == destination:
48+
return True
49+
for nei_node in graph[node]:
50+
if nei_node not in seen:
51+
seen.add(nei_node)
52+
stack.append(nei_node)
53+
54+
return False
55+
56+
57+
58+
# BFS With Queue
59+
from collections import deque
60+
class Solution:
61+
def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
62+
if source == destination:
63+
return True
64+
65+
graph = defaultdict(list)
66+
for u, v in edges:
67+
graph[u].append(v)
68+
graph[v].append(u)
69+
70+
seen = set()
71+
seen.add(source)
72+
q = deque()
73+
q.append(source)
74+
75+
while q:
76+
node = q.popleft()
77+
if node == destination:
78+
return True
79+
for nei_node in graph[node]:
80+
if nei_node not in seen:
81+
seen.add(nei_node)
82+
q.append(nei_node)
83+
84+
return False # Time: O(N + E), Space: O(N + E)

0 commit comments

Comments
 (0)