Skip to content

Commit a0facc7

Browse files
committed
feat: add solutions to lc problem: No.2192
No.2192.All Ancestors of a Node in a Directed Acyclic Graph
1 parent 785bbf1 commit a0facc7

File tree

6 files changed

+421
-2
lines changed

6 files changed

+421
-2
lines changed

solution/2100-2199/2192.All Ancestors of a Node in a Directed Acyclic Graph/README.md

Lines changed: 144 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,165 @@
6565

6666
<!-- 这里可写通用的实现逻辑 -->
6767

68+
**方法一:BFS**
69+
6870
<!-- tabs:start -->
6971

7072
### **Python3**
7173

7274
<!-- 这里可写当前语言的特殊实现逻辑 -->
7375

7476
```python
75-
77+
class Solution:
78+
def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
79+
g = defaultdict(list)
80+
for u, v in edges:
81+
g[v].append(u)
82+
ans = []
83+
for i in range(n):
84+
if not g[i]:
85+
ans.append([])
86+
continue
87+
q = deque([i])
88+
vis = [False] * n
89+
vis[i] = True
90+
t = []
91+
while q:
92+
for _ in range(len(q)):
93+
v = q.popleft()
94+
for u in g[v]:
95+
if not vis[u]:
96+
vis[u] = True
97+
q.append(u)
98+
t.append(u)
99+
ans.append(sorted(t))
100+
return ans
76101
```
77102

78103
### **Java**
79104

80105
<!-- 这里可写当前语言的特殊实现逻辑 -->
81106

82107
```java
108+
class Solution {
109+
public List<List<Integer>> getAncestors(int n, int[][] edges) {
110+
List<Integer>[] g = new List[n];
111+
for (int i = 0; i < n; ++i) {
112+
g[i] = new ArrayList<>();
113+
}
114+
for (int[] e : edges) {
115+
g[e[1]].add(e[0]);
116+
}
117+
List<List<Integer>> ans = new ArrayList<>();
118+
for (int i = 0; i < n; ++i) {
119+
List<Integer> t = new ArrayList<>();
120+
if (g[i].isEmpty()) {
121+
ans.add(t);
122+
continue;
123+
}
124+
Deque<Integer> q = new ArrayDeque<>();
125+
q.offer(i);
126+
boolean[] vis = new boolean[n];
127+
vis[i] = true;
128+
while (!q.isEmpty()) {
129+
for (int j = q.size(); j > 0; --j) {
130+
int v = q.poll();
131+
for (int u : g[v]) {
132+
if (!vis[u]) {
133+
vis[u] = true;
134+
q.offer(u);
135+
t.add(u);
136+
}
137+
}
138+
}
139+
}
140+
Collections.sort(t);
141+
ans.add(t);
142+
}
143+
return ans;
144+
}
145+
}
146+
```
147+
148+
### **C++**
149+
150+
```cpp
151+
class Solution {
152+
public:
153+
vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
154+
vector<vector<int>> g(n);
155+
for (auto& e : edges) g[e[1]].push_back(e[0]);
156+
vector<vector<int>> ans;
157+
for (int i = 0; i < n; ++i)
158+
{
159+
vector<int> t;
160+
if (g[i].empty())
161+
{
162+
ans.push_back(t);
163+
continue;
164+
}
165+
queue<int> q{{i}};
166+
vector<bool> vis(n);
167+
vis[i] = true;
168+
while (!q.empty())
169+
{
170+
for (int j = q.size(); j > 0; --j)
171+
{
172+
int v = q.front();
173+
q.pop();
174+
for (int u : g[v])
175+
{
176+
if (vis[u]) continue;
177+
vis[u] = true;
178+
q.push(u);
179+
t.push_back(u);
180+
}
181+
}
182+
}
183+
sort(t.begin(), t.end());
184+
ans.push_back(t);
185+
}
186+
return ans;
187+
}
188+
};
189+
```
83190
191+
### **Go**
192+
193+
```go
194+
func getAncestors(n int, edges [][]int) [][]int {
195+
g := make([][]int, n)
196+
for _, e := range edges {
197+
g[e[1]] = append(g[e[1]], e[0])
198+
}
199+
var ans [][]int
200+
for i := 0; i < n; i++ {
201+
var t []int
202+
if len(g[i]) == 0 {
203+
ans = append(ans, t)
204+
continue
205+
}
206+
q := []int{i}
207+
vis := make([]bool, n)
208+
vis[i] = true
209+
for len(q) > 0 {
210+
for j := len(q); j > 0; j-- {
211+
v := q[0]
212+
q = q[1:]
213+
for _, u := range g[v] {
214+
if !vis[u] {
215+
vis[u] = true
216+
q = append(q, u)
217+
t = append(t, u)
218+
}
219+
}
220+
}
221+
}
222+
sort.Ints(t)
223+
ans = append(ans, t)
224+
}
225+
return ans
226+
}
84227
```
85228

86229
### **TypeScript**

solution/2100-2199/2192.All Ancestors of a Node in a Directed Acyclic Graph/README_EN.md

Lines changed: 144 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,161 @@ The above diagram represents the input graph.
5757

5858
## Solutions
5959

60+
BFS.
61+
6062
<!-- tabs:start -->
6163

6264
### **Python3**
6365

6466
```python
65-
67+
class Solution:
68+
def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
69+
g = defaultdict(list)
70+
for u, v in edges:
71+
g[v].append(u)
72+
ans = []
73+
for i in range(n):
74+
if not g[i]:
75+
ans.append([])
76+
continue
77+
q = deque([i])
78+
vis = [False] * n
79+
vis[i] = True
80+
t = []
81+
while q:
82+
for _ in range(len(q)):
83+
v = q.popleft()
84+
for u in g[v]:
85+
if not vis[u]:
86+
vis[u] = True
87+
q.append(u)
88+
t.append(u)
89+
ans.append(sorted(t))
90+
return ans
6691
```
6792

6893
### **Java**
6994

7095
```java
96+
class Solution {
97+
public List<List<Integer>> getAncestors(int n, int[][] edges) {
98+
List<Integer>[] g = new List[n];
99+
for (int i = 0; i < n; ++i) {
100+
g[i] = new ArrayList<>();
101+
}
102+
for (int[] e : edges) {
103+
g[e[1]].add(e[0]);
104+
}
105+
List<List<Integer>> ans = new ArrayList<>();
106+
for (int i = 0; i < n; ++i) {
107+
List<Integer> t = new ArrayList<>();
108+
if (g[i].isEmpty()) {
109+
ans.add(t);
110+
continue;
111+
}
112+
Deque<Integer> q = new ArrayDeque<>();
113+
q.offer(i);
114+
boolean[] vis = new boolean[n];
115+
vis[i] = true;
116+
while (!q.isEmpty()) {
117+
for (int j = q.size(); j > 0; --j) {
118+
int v = q.poll();
119+
for (int u : g[v]) {
120+
if (!vis[u]) {
121+
vis[u] = true;
122+
q.offer(u);
123+
t.add(u);
124+
}
125+
}
126+
}
127+
}
128+
Collections.sort(t);
129+
ans.add(t);
130+
}
131+
return ans;
132+
}
133+
}
134+
```
135+
136+
### **C++**
137+
138+
```cpp
139+
class Solution {
140+
public:
141+
vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
142+
vector<vector<int>> g(n);
143+
for (auto& e : edges) g[e[1]].push_back(e[0]);
144+
vector<vector<int>> ans;
145+
for (int i = 0; i < n; ++i)
146+
{
147+
vector<int> t;
148+
if (g[i].empty())
149+
{
150+
ans.push_back(t);
151+
continue;
152+
}
153+
queue<int> q{{i}};
154+
vector<bool> vis(n);
155+
vis[i] = true;
156+
while (!q.empty())
157+
{
158+
for (int j = q.size(); j > 0; --j)
159+
{
160+
int v = q.front();
161+
q.pop();
162+
for (int u : g[v])
163+
{
164+
if (vis[u]) continue;
165+
vis[u] = true;
166+
q.push(u);
167+
t.push_back(u);
168+
}
169+
}
170+
}
171+
sort(t.begin(), t.end());
172+
ans.push_back(t);
173+
}
174+
return ans;
175+
}
176+
};
177+
```
71178
179+
### **Go**
180+
181+
```go
182+
func getAncestors(n int, edges [][]int) [][]int {
183+
g := make([][]int, n)
184+
for _, e := range edges {
185+
g[e[1]] = append(g[e[1]], e[0])
186+
}
187+
var ans [][]int
188+
for i := 0; i < n; i++ {
189+
var t []int
190+
if len(g[i]) == 0 {
191+
ans = append(ans, t)
192+
continue
193+
}
194+
q := []int{i}
195+
vis := make([]bool, n)
196+
vis[i] = true
197+
for len(q) > 0 {
198+
for j := len(q); j > 0; j-- {
199+
v := q[0]
200+
q = q[1:]
201+
for _, u := range g[v] {
202+
if !vis[u] {
203+
vis[u] = true
204+
q = append(q, u)
205+
t = append(t, u)
206+
}
207+
}
208+
}
209+
}
210+
sort.Ints(t)
211+
ans = append(ans, t)
212+
}
213+
return ans
214+
}
72215
```
73216

74217
### **TypeScript**
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
4+
vector<vector<int>> g(n);
5+
for (auto& e : edges) g[e[1]].push_back(e[0]);
6+
vector<vector<int>> ans;
7+
for (int i = 0; i < n; ++i)
8+
{
9+
vector<int> t;
10+
if (g[i].empty())
11+
{
12+
ans.push_back(t);
13+
continue;
14+
}
15+
queue<int> q{{i}};
16+
vector<bool> vis(n);
17+
vis[i] = true;
18+
while (!q.empty())
19+
{
20+
for (int j = q.size(); j > 0; --j)
21+
{
22+
int v = q.front();
23+
q.pop();
24+
for (int u : g[v])
25+
{
26+
if (vis[u]) continue;
27+
vis[u] = true;
28+
q.push(u);
29+
t.push_back(u);
30+
}
31+
}
32+
}
33+
sort(t.begin(), t.end());
34+
ans.push_back(t);
35+
}
36+
return ans;
37+
}
38+
};

0 commit comments

Comments
 (0)