#include #include #include #include #include int main() { using namespace std; int n; cin >> n; vector> edges; atcoder::scc_graph scc(n); vector level(n); for (int i = 0; i < n; i++) { int l, s; cin >> l >> s; edges.emplace_back(s - 1, i); scc.add_edge(s - 1, i); level[i] = l; } vector> groups = scc.scc(); vector group_id(n); int m = groups.size(); for (int i = 0; i < m; i++) { for (int v : groups[i]) { group_id[v] = i; } } vector indeg(m, 0); for (auto [u, v] : edges) { if (group_id[u] == group_id[v]) { continue; } indeg[group_id[v]]++; } int ans = 0; for (int i = 0; i < m; i++) { int lv_sum = 0, min_lv = 1000; for (int v : groups[i]) { lv_sum += level[v]; min_lv = min(min_lv, level[v]); } ans += lv_sum; if (indeg[i] == 0) { ans += min_lv; } } cout << ans / 2 << '.' << (ans % 2 == 0 ? 0 : 5) << endl; }