結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
tnodino
|
| 提出日時 | 2022-02-09 21:26:49 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 38 ms / 5,000 ms |
| コード長 | 2,057 bytes |
| コンパイル時間 | 222 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 11,136 KB |
| 最終ジャッジ日時 | 2024-06-25 01:37:24 |
| 合計ジャッジ時間 | 1,812 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
class StronglyConnectedComponent:
def __init__(self, N):
self.N = N
self.G = [[] for _ in range(N)]
self.RevG = [[] for _ in range(N)]
def AddEdge(self, u, v):
self.G[u].append(v)
self.RevG[v].append(u)
def dfs(self, u):
self.Used[u] = True
for v in self.G[u]:
if not self.Used[v]:
self.dfs(v)
self.PostOrder.append(u)
def Revdfs(self, u):
self.Group[u] = self.Lbcnt
self.Used[u] = True
for v in self.RevG[u]:
if not self.Used[v]:
self.Revdfs(v)
def Build(self):
self.PostOrder = []
self.Used = [False] * self.N
for i in range(self.N):
if not self.Used[i]:
self.dfs(i)
self.Used = [False] * self.N
self.Group = [None] * self.N
self.Lbcnt = 0
for i in reversed(self.PostOrder):
if not self.Used[i]:
self.Revdfs(i)
self.Lbcnt += 1
def Construct(self):
DAG = [[] for _ in range(self.Lbcnt)]
Groups = [[] for _ in range(self.Lbcnt)]
for u in range(self.N):
Lbu = self.Group[u]
for v in self.G[u]:
Lbv = self.Group[v]
if Lbu == Lbv:
continue
DAG[Lbu].append(Lbv)
Groups[Lbu].append(u)
return DAG, Groups
def dfs(u):
flg[u] = True
ret = 0
for i in Groups[u]:
ret += L[i] / 2
for v in DAG[u]:
ret += dfs(v)
return ret
def MinCheck(u):
ret = 1<<32
for i in Groups[u]:
ret = min(ret, L[i])
return ret / 2
N = int(input())
Z = [list(map(int,input().split())) for _ in range(N)]
L,S = [list(i) for i in zip(*Z)]
SCC = StronglyConnectedComponent(N)
for i in range(N):
SCC.AddEdge(S[i]-1, i)
SCC.Build()
DAG,Groups = SCC.Construct()
M = SCC.Lbcnt
flg = [False] * M
ans = 0
for i in range(M):
if not flg[i]:
ans += dfs(i)
ans += MinCheck(i)
print(ans)
tnodino