#include using namespace std; const int N = 110, M = N << 1; const int INF = 0x3f3f3f3f; int n; int x[N]; // 点权权值数组 int st[N]; // st 数组存是否遍历过这个节点 int dis[N][N]; // 存节点间的距离 // 链式前向星 int e[M], h[N], idx, w[M], ne[M]; void add(int a, int b, int c = 0) { e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; } void dfs(int root, int u, int step) { // root 表示根,u:当前走到哪个节点,step:到u点时走了几步 st[u] = 1; // u走过了,防止回头路 dis[root][u] = step, dis[u][root] = step; // root<->u之间的路径长度 for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (st[v]) continue; dfs(root, v, step + 1); } } int main() { // 初始化链式前向星 memset(h, -1, sizeof h); cin >> n; for (int i = 1; i <= n; i++) { int a, b; cin >> x[i] >> a >> b; if (a) add(i, a), add(a, i); // 存图 if (b) add(i, b), add(b, i); } for (int i = 1; i <= n; i++) { memset(st, 0, sizeof st); dfs(i, i, 0); // 搜索 } int ans = INF; for (int i = 1; i <= n; i++) { int s = 0; for (int j = 1; j <= n; j++) s = s + x[j] * dis[i][j]; // 累加距离 ans = min(ans, s); } cout << ans << endl; return 0; }