module main; // https://kmjp.hatenablog.jp/entry/2014/11/05/0930 より // 強連結成分分解 import std; int N; int[] L, S; bool[] visited, done; int dfs(int cur, int tar) { int x; if (done[S[cur]]) return -1; if (cur == tar) return tar; if (visited[S[cur]]) return -1; visited[cur] = true; x = dfs(S[cur], tar); if (x < 0) return -1; if (L[cur] < L[x]) return cur; return x; } void main() { // 入力 N = readln.chomp.to!int; L = new int[](N), S = new int[](N); visited = new bool[](N), done = new bool[](N); foreach (i; 0 .. N) { readln.chomp.formattedRead("%d %d", L[i], S[i]); --S[i]; L[i] *= 2; } // 答えの計算 int ans = 0; foreach (i; 0 .. N) { if (done[i]) continue; visited[] = false; int x = dfs(S[i], i); if (x >= 0) { ans += L[x]; done[x] = true; } } foreach (i; 0 .. N) foreach (j; 0 .. N) if (done[S[j]] && !done[j]) { done[j] = true; ans += L[j] / 2; } // 答えの出力 writefln("%.1f", ans / 2.0); }