#include using namespace std; const int N = 210; bool d[N][N]; //这里n小我就直接邻接矩阵了,如果用邻接表还能快点 bool st[N]; //是不是使用过了,这个是必须要有了,否则不就死循环了吗 int p[N]; //权值数组 int n; //n个医院 int ans = 0x3f3f3f3f; //答案 struct Node { int sq_sum; //几号结点 int step;//到这个结点走了多少步了 }; //bfs找当前点x为医院设置点时的总距离 int bfs(int x) { //每次计算前需要清空一下使用过的标识数组 memset(st, 0, sizeof(st)); //队列 queue q; st[x] = true; //使用过了 q.push({x, 0});//放入队列 int sum = 0;//本次运算的权值和 while (!q.empty()) { Node node = q.front(); q.pop(); for (int i = 1; i <= n; i++) //如果两个结点之间是联通的,并且没有走过 if (d[node.num][i] && !st[i]) { //准备继续探索 Node next = {i, node.step + 1}; sum += p[i] * next.step; //权值在增加 st[i] = true; //标识使用过了 q.push(next); //放入队列 } } return sum; } int main() { //读入数据到邻接矩阵 cin >> n; for (int i = 1; i <= n; i++) { int l, r; cin >> p[i] >> l >> r; if (l) d[i][l] = d[l][i] = true;//为0表示无链接,双向建图 if (r) d[i][r] = d[r][i] = true;//为0表示无链接,双向建图 } //遍历每个结点作为医院部署地 for (int i = 1; i <= n; i++) ans = min(ans, bfs(i)); cout << ans << endl; return 0; }