Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5c67ef4

Browse files
committed
feat: 109. 冗余连接II新增python解法
1 parent faeda4b commit 5c67ef4

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

‎problems/kamacoder/0109.冗余连接II.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,92 @@ public class Main {
351351
```
352352
### Python
353353

354+
```python
355+
from collections import defaultdict
356+
357+
father = list()
358+
359+
360+
def find(u):
361+
if u == father[u]:
362+
return u
363+
else:
364+
father[u] = find(father[u])
365+
return father[u]
366+
367+
368+
def is_same(u, v):
369+
u = find(u)
370+
v = find(v)
371+
return u == v
372+
373+
374+
def join(u, v):
375+
u = find(u)
376+
v = find(v)
377+
if u != v:
378+
father[u] = v
379+
380+
381+
def is_tree_after_remove_edge(edges, edge, n):
382+
# 初始化并查集
383+
global father
384+
father = [i for i in range(n + 1)]
385+
386+
for i in range(len(edges)):
387+
if i == edge:
388+
continue
389+
s, t = edges[i]
390+
if is_same(s, t): # 成環,即不是有向樹
391+
return False
392+
else: # 將s,t放入集合中
393+
join(s, t)
394+
return True
395+
396+
397+
def get_remove_edge(edges):
398+
# 初始化并查集
399+
global father
400+
father = [i for i in range(n + 1)]
401+
402+
for s, t in edges:
403+
if is_same(s, t):
404+
print(s, t)
405+
return
406+
else:
407+
join(s, t)
408+
409+
410+
if __name__ == "__main__":
411+
# 輸入
412+
n = int(input())
413+
edges = list()
414+
in_degree = defaultdict(int)
415+
416+
for i in range(n):
417+
s, t = map(int, input().split())
418+
in_degree[t] += 1
419+
edges.append([s, t])
420+
421+
# 尋找入度為2的邊,並紀錄其下標(index)
422+
vec = list()
423+
for i in range(n - 1, -1, -1):
424+
if in_degree[edges[i][1]] == 2:
425+
vec.append(i)
426+
427+
# 輸出
428+
if len(vec) > 0:
429+
# 情況一:刪除輸出順序靠後的邊
430+
if is_tree_after_remove_edge(edges, vec[0], n):
431+
print(edges[vec[0]][0], edges[vec[0]][1])
432+
# 情況二:只能刪除特定的邊
433+
else:
434+
print(edges[vec[1]][0], edges[vec[1]][1])
435+
else:
436+
# 情況三: 原圖有環
437+
get_remove_edge(edges)
438+
```
439+
354440
### Go
355441

356442
### Rust

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /