結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
|
| 提出日時 | 2022-07-10 18:09:47 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 41 ms / 5,000 ms |
| コード長 | 2,058 bytes |
| コンパイル時間 | 265 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 53,248 KB |
| 最終ジャッジ日時 | 2024-06-11 08:10:25 |
| 合計ジャッジ時間 | 2,008 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
def scc(N, G):
order = []
used = [False]*N
group = [None]*N
RG = [[] for _ in range(N)]
for i in range(N):
for j in G[i]:
RG[j].append(i)
def dfs(pos):
stack = [(1, pos), (0, pos)]
while stack:
t, pos = stack.pop()
if t == 0:
if used[pos]:
stack.pop()
continue
used[pos] = True
for npos in G[pos]:
if not used[npos]:
stack.append((1, npos))
stack.append((0, npos))
else:
order.append(pos)
def rdfs(pos, col):
stack = [pos]
group[pos] = col
used[pos] = True
while stack:
pos = stack.pop()
for npos in RG[pos]:
if not used[npos]:
used[npos] = True
group[npos] = col
stack.append(npos)
for i in range(N):
if not used[i]:
dfs(i)
used = [False]*N
label = 0
for s in reversed(order):
if not used[s]:
rdfs(s, label)
label += 1
return label, group
def construct(N, G, label, group):
G0 = [[] for _ in range(label)]
GP = [[] for _ in range(label)]
for v in range(N):
lbs = group[v]
for w in G[v]:
lbt = group[w]
if lbs == lbt:
continue
G0[lbs].append(lbt)
GP[lbs].append(v)
return G0, GP
n = int(input())
edges = [[] for _ in range(n)]
L = []
for i in range(n):
l, s = map(int, input().split())
s -= 1
L.append(l)
edges[s].append(i)
label, group = scc(n, edges)
g0, gp = construct(n, edges, label, group)
in_ = [0] * label
for i in range(label):
for j in g0[i]:
in_[j] += 1
ans = sum(L)
for i in range(label):
if in_[i] == 0:
mi = 1 << 30
for p in gp[i]:
mi = min(mi, L[p])
ans += mi
print(ans / 2)