アルゴリズムパターン
2083 ワード
質問する
グラフに深さを保存する必要があることを考慮して、dfsを使用して深さをパラメータとして再帰関数に入れるべきだと思います.
しかしdfsで解くと,dfsはグラフを1層ずつ剥がすので深さを測定するのは難しい. なのでbfsで解くべきだと思いますが、最初は1段階に2つ以上のノードがある場合、測定深さは2番目のノードから葛藤すると思います. は,前段階のノード深さに+1を加えたコードを思いついた. 最後に,最大depthを有するノードの個数を計算するために最も効率的なコードとは何かを見てみよう.
回答時間:1時間50分
最も遠いノード
from collections import deque
import time
def solution(n, edge):
# st = time.time()
grid = [ [] for _ in range(n+1)]
for i in edge:
grid[i[0]].append(i[1])
grid[i[1]].append(i[0])
visited = [False for _ in range(n+1)]
# 노드의 깊이를 저장하는 리스트
depths = [0 for _ in range(n+1)]
# bfs 시작
s = 1
visited[s] = True
que = deque([s])
d = 0
while que:
a = que.popleft()
if grid[a]:
d = depths[a] + 1
# 그 전 단계의 노드의 depth + 1
for i in grid[a]:
if not visited[i]:
que.append(i)
depths[i] = d
visited[i] = True
cnt = 0
for i in depths:
if i == max(depths):
cnt += 1
# depths.sort(reverse=True)
# cnt = depths.count(depths[0])
# print(time.time()-st)
return cnt
しかしdfsで解くと,dfsはグラフを1層ずつ剥がすので深さを測定するのは難しい.
def bfs(s):
visited[s] = True
que = deque([s])
d = 0
while que:
a = que.popleft()
print(a)
if grid[a]:
d += 1
for i in grid[a]:
if not visited[i]:
que.append(i)
depths[i] = d
visited[i] = True
cnt = 0
for i in depths:
if i == max(depths):
cnt += 1
->1.740秒depths.sort(reverse=True)
cnt = depths.count(depths[0])
->1.478秒cnt = depths.count(max(depths))
->1.430秒回答時間:1時間50分
Reference
この問題について(アルゴリズムパターン), 我々は、より多くの情報をここで見つけました https://velog.io/@ann9902/알고리즘Python그래프テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol