#include #include #include int main() { using namespace std; int n; cin >> n; vector level(n), stk; vector> g(n); for (int i = 0; i < n; i++) { int l, s; cin >> l >> s; level[i] = l; if (i == s - 1) { stk.push_back(i); } else { g[s - 1].push_back(i); } } vector cleared(n, false), half(n, false); int ans = 0; while (!stk.empty()) { int v = stk.back(); stk.pop_back(); ans += (half[v] ? level[v] : level[v] * 2); cleared[v] = true; for (int nv : g[v]) { if (cleared[nv]) { continue; } stk.push_back(nv); half[nv] = true; } } for (int i = 0; i < n; i++) { if (cleared[i]) { continue; } vector lv, st = {i}; while (!st.empty()) { int v = st.back(); st.pop_back(); cleared[v] = true; lv.push_back(level[v]); for (int nv : g[v]) { if (cleared[nv]) { continue; } st.push_back(nv); } } sort(lv.begin(), lv.end()); ans += lv[0]; for (int e : lv) { ans += e; } } cout << ans / 2 << '.' << (ans % 2 == 0 ? 0 : 5) << endl; }