from collections import defaultdict from atcoder.scc import SCCGraph def scc(n: int, adj: dict[int, list[int]]) -> list[list[int]]: """グラフを強連結成分分解する。 Args: n: 頂点数 adj: 隣接リスト {u: [v...]} Returns: 強連結成分のリスト (トポロジカル順) """ g = SCCGraph(n) for u, vs in adj.items(): for v in vs: g.add_edge(u, v) return g.scc() N = int(input()) adj = defaultdict(list) difficulties = [] # 各ステージの難易度 for i in range(N): L, S = map(int, input().split()) S -= 1 # S がクリア済みだと i の難易度が半分になる adj[S].append(i) difficulties.append(L) cc = scc(N, adj) ans = 0 discounted = set() # 難易度が半分の頂点集合 for g in cc: # グループ g に属するステージをクリアする ds = [difficulties[v] for v in g] if any(v in discounted for v in g): ans += sum(ds) / 2 else: mi = min(ds) ans += sum(ds) / 2 + mi / 2 for v in g: for to in adj[v]: discounted.add(to) print(ans)