16562友達bedfs
8549 ワード
骨.
これは現在進行中のアルゴリズム研究が当日解決しなければならない問題である.
これはスタックをテーマとした問題であり,問題の発起者はdfsで解決できる問題であるため,スタックを適用して解決する問題であると考えられる.
しかし,この問題の鍵はスタックを利用することではなく,隣接リストを介して友人関係の組合せを確立することである.
これは一般的なdfs問題であるが,友人関係のグループで最も費用がかかるノードを見つける必要があり,これは問題の難易度を高める要因である.
実際、私もdfsを回すだけで、開始ノードの費用だけを格納しているので、一度間違えました.
はすべての友人関係を巡回し始めた. は、dfsを介して友人関係に関連するノードを検索する. dfsで探索を行い,接続した友人料金の最小値を更新する. はすべての巡回を完了し、配列のすべての和を求め、kより小さい場合はその値を出力し、kより大きい場合は費用を支払うことができないためoh noを出力する.
これは現在進行中のアルゴリズム研究が当日解決しなければならない問題である.
これはスタックをテーマとした問題であり,問題の発起者はdfsで解決できる問題であるため,スタックを適用して解決する問題であると考えられる.
しかし,この問題の鍵はスタックを利用することではなく,隣接リストを介して友人関係の組合せを確立することである.
これは一般的なdfs問題であるが,友人関係のグループで最も費用がかかるノードを見つける必要があり,これは問題の難易度を高める要因である.
実際、私もdfsを回すだけで、開始ノードの費用だけを格納しているので、一度間違えました.
問題を解く
import sys
sys.setrecursionlimit(5000)
N, M, k = map(int, input().split(" "))
expense = list(map(int, input().split(" ")))
visited = [False] * (N+1)
MIN = 0
relationship = [[] for _ in range(N+1)]
min_expense = [0] * (N+1)
payment = 0
for _ in range(M):
a, b = map(int, input().split(" "))
relationship[a].append(b)
relationship[b].append(a)
def solution():
global payment, MIN
for i in range(1, N+1):
if not visited[i]:
visited[i] = True
MIN = int(1e9)
dfs(i)
min_expense[i] = MIN
if sum(min_expense) > k:
print("Oh no")
else:
print(sum(min_expense))
def dfs(node):
global MIN
MIN = min(MIN, expense[node-1])
for i in relationship[node]:
if not visited[i]:
visited[i] = True
dfs(i)
return
solution()
Reference
この問題について(16562友達bedfs), 我々は、より多くの情報をここで見つけました https://velog.io/@lky9303/16562-친구비-dfsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol