【AtCoder参加記録】ABC226【AB2完】

f:id:itsy68:20211108005450p:plain
C問題
https://atcoder.jp/contests/abc226/tasks/abc226_c
に70分ほどかけましたがACできず終了しました。
ABC3完が当面の目標になりそうです。

WAとなったコード

N = int(input())
T = []
K = []
A = []
 
cost = [0]*N
 
for i in range(0, N):
    ls = list(map(int, input().split()))
    T.append(ls[0])
    K.append(ls[1])
    A.append(ls[2:])
    if K[i] == 0:
        cost[i] += T[i]
    else:
        cost[i] = sum([cost[j-1] for j in A[i]]) + T[i]
print(cost[N-1])

解説を見ての実装

N = int(input())
T = []
K = []
A = []
 
for i in range(0, N):
    ls = list(map(int, input().split()))
    T.append(ls[0])
    K.append(ls[1])
    a = [j-1 for j in ls[2:]]
    A.append(a)
 
 
used = [False]*N
used[N-1] = True
ans = 0
for i in reversed(range(N)):
    if used[i]:
        ans += T[i]
        for j in range(K[i]):
            used[A[i][j]] = True
print(ans)

アルゴリズム実技検定公式テキストの深さ優先探索のコードを応用。
https://github.com/kenkoooo/pastbook-source-code/blob/master/chukyu/python/chapter06/section03/6-3-2.py

import sys
sys.setrecursionlimit(1000000)
N = int(input())
T = []
K = []
A = []
 
for i in range(0, N):
    ls = list(map(int, input().split()))
    T.append(ls[0])
    K.append(ls[1])
    a = [j-1 for j in ls[2:]]
    A.append(a)
 
visited = [False]*N
ans = 0
# 再帰関数 dfs を定義する。
def dfs(i):
    global ans
    visited[i] = True
    ans += T[i]            
    for i2 in A[i]:
        if not visited[i2]:            
            dfs(i2)
dfs(N-1)
 
print(ans)

Nを始点としたグラフと考えれば良いという問題だったようです。