免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/LSC_333/article/details/91369433
効果の対象に
リーフノードの重みを見つけるために、ルートノードから木へと与えられています パス
エントリー
含む各テストケース
の最初の行を
、ツリー内のノードの数を表します。
非リーフノードを表し、
与えられ表す
第二のラインが有します
の各ノードの重み値を表す正の数値、及び重み値は1000未満である
が後
行、各非リーフノードを表す情報、フォーマットにおいてID K ID[1] ID[2] ... ID[K]
、ID
ノードの数を示しK
、その後に続く子供の数は、K
数がそれぞれの子ノードの数を表す、すべての数は、2桁の数字であります
輸出
各サンプルについて、もし非減少順に出力パス重量に対して複数のパス
非減少:配列
シーケンスより大きい
が存在する場合に限り、
となるよう
(
)と
サンプル入力
20 9 24
10 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 2
00 4 01 02 03 04
02 1 05
04 2 06 07
03 3 11 12 13
06 1 09
07 2 08 10
16 1 15
13 3 14 16 17
17 2 18 19
サンプル出力
5 2 7 10
10 4 10
10 3 3 6 2
10 3 3 6 2
解決
この問題は、ルートノードからリーフノードにツリーをトラバースする、ツリートラバーサルであり、また、重みを計算し、重みに従って降順にするとき、サブ入力ノードので、マッチングの探索に必要な注文のそれぞれの出力は、意志タイトルパスの意味
# -*- coding: utf-8 -*-
# @Time : 2019/6/10 11:23
# @Author : ValarMorghulis
# @File : 1053.py
class node:
def __init__(self, weight):
self.weight = weight
self.child = list()
def toString(self):
return "weight:%d\n" % self.weight + str(self.child)
tree = list()
n, m, s = 0, 0, 0
path = list()
def dfs(root, sum):
global path
if sum > s:
return
if sum == s:
if tree[root].child:
return
for i in range(len(path)):
print("%d" % path[i], end=('\n' if i == len(path) - 1 else ' '))
return
for i in range(len(tree[root].child)):
path.append(tree[tree[root].child[i]].weight)
dfs(tree[root].child[i], sum+tree[tree[root].child[i]].weight)
path.pop()
def solve():
global n, m, s, tree, path
n, m, s = map(int, input().split())
w = list(map(int, input().split()))
for i in range(n):
t = node(w[i])
tree.append(t)
for i in range(m):
line = list(map(int, input().split()))
id = line[0]
tree[id].child = line[2:]
tree[id].child = sorted(tree[id].child, key=lambda x: tree[x].weight, reverse=True)
path.append(tree[0].weight)
dfs(0, tree[0].weight)
if __name__ == "__main__":
solve()