#include<iostream>
#include<queue>
using namespace std;
int n,num,leftc,rightc,ans=100000000;
struct city{
int pe;
int l;
int r;
int parent;
int data;
int step;
};
city node[110];
int bfs(int aim)
{
int mark[110]={};//mark[i]数组标记i号地点是否被访问过,0代表该地点位被访问,1代表该地点被访问过
int sum=0;
queue<city>q;
mark[aim]=1;
q.push(node[aim]);//医院编号入列
while(!q.empty())
{
city tmp=q.front();
if(tmp.l && !mark[tmp.l])//该节点存在左子节点且左子节点未被访问过
{
q.push(node[tmp.l]);//该节点的左子节点入列
node[tmp.l].step=tmp.step+1;
sum+=node[tmp.l].pe*node[tmp.l].step;
}
if(tmp.r && !mark[tmp.r])//该节点存在右子节点且右子节点未被访问过
{
q.push(node[tmp.r]);//该节点的右子节点入列
node[tmp.r].step=tmp.step+1;
sum+=node[tmp.r].pe*node[tmp.r].step;
}
if(tmp.parent && !mark[tmp.parent])//该节点存在父节点且父节点未被访问过
{
q.push(node[tmp.parent]);//该节点的父节点入列
node[tmp.parent].step=tmp.step+1;
sum+=node[tmp.parent].pe*node[tmp.parent].step;
}
cout << tmp.data << " ";
mark[tmp.data]=1;//标记该节点已被访问
q.pop();//队首拓展结束出列
}
return sum;
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> num >> leftc >> rightc;
node[i].pe=num;
node[i].l=leftc;
node[i].r=rightc;
node[rightc].parent=i;
node[leftc].parent=i;
node[i].data=i;
}
for(int i=1;i<=n;i++)
{
for(int i=1;i<=n;i++) node[i].step=0;//步长清零
ans=min(ans,bfs(i));
}
cout << ans;
}
每个节点的step都为1,第n轮拓展结束后的节点的step应该为n但是结果全都是1