void main() { const N = readInt; auto L = new int[N]; auto S = new int[N]; foreach (i; 0 .. N) { L[i] = readInt; S[i] = readInt; S[i]--; } auto vis = new int[N]; int ans; foreach (i; 0 .. N) if (!vis[i]) { int u = i; do { vis[u] = i + 1; ans += L[u]; u = S[u]; } while(!vis[u]); if (vis[u] == i + 1) { int v = u; int MIN = 100; do { chmin(MIN, L[u]); u = S[u]; } while (u != v); ans += MIN; } } writeln(ans / 2, ans % 2 ? ".5" : ".0"); } import std,core.bitop; string[]_R; string readString(){while(_R.empty){_R=readln.chomp.split;}auto ret=_R.front;_R.popFront;return ret;} int readInt(){return readString.to!int;} long readLong(){return readString.to!long;} ulong readULong(){return readString.to!ulong;} real readReal(){return readString.to!real;} bool chmin(T)(ref T A,T B){if(A>B){A=B;return true;}else{return false;}} bool chmax(T)(ref T A,T B){if(A1){int mid=(L+R)/2;(A[mid]1){int mid=(L+R)/2;(A[mid]<=x?L:R)=mid;}return R;}