同重量のPAT1 1053パス

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/LSC_333/article/details/91369433

トピックリンク
私のgithubの

効果の対象に

リーフノードの重みを見つけるために、ルートノードから木へと与えられています S S パス

エントリー

含む各テストケース
の最初の行を N 100 N \ leq100 、ツリー内のノードの数を表します。 M < N M< N 非リーフノードを表し、 S < 2 30 S< 2 ^ {30} 与えられ表す
第二のラインが有します N N の各ノードの重み値を表す正の数値、及び重み値は1000未満である
が後 M M 行、各非リーフノードを表す情報、フォーマットにおいてID K ID[1] ID[2] ... ID[K]IDノードの数を示しK、その後に続く子供の数は、K数がそれぞれの子ノードの数を表す、すべての数は、2桁の数字であります

輸出

各サンプルについて、もし非減少順に出力パス重量に対して複数のパス
非減少:配列 A 1 A 2 A n個 A_1、A_2 ... A_N シーケンスより大きい B 1 B 2 B メートル B_1、B_2 ... B_m が存在する場合に限り、 1 K < m i n { n , m } 1 \当量K&L​​T;分\ {N、Mの\} となるよう A i = B i a_iを= B_i i = 1... k I = 1 ... K )と A k + 1 > B k + 1 A_ {K + 1}> B_ {K + 1}

サンプル入力

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()

おすすめ

転載: blog.csdn.net/LSC_333/article/details/91369433