这是一道广搜的题目 题目本身不难 基本思路:先定义一个结构,结构中有4个参数,第一个表示人数,第二个表示该节点的左孩子,还有一个表示该节点的右孩子。最后一个表示这个节点的父节点,注意,这个父节点不是输入的,而是求出来的。定义一个函数来求每个节点的父节点。然后用一个for循环来遍历每个点,分别设置为起始节点,然后就是依次入队,出对,扩展节点
代码如下
#include<bits/stdc++.h>
using namespace std;
int n;
int cont=INT_MAX;
struct node
{
int s,z,y,f;//z表示左孩子 y表示右孩子 f表示父节点 s表示人数
}a[110];
struct Node
{
int r1,k1,s1;//s1表示人口数 k1表示距离起始点的距离 r1表示数组下标
Node(int r1,int k1,int s1):r1(r1),k1(k1),s1(s1){};
};
int visited[110];
int sum=0;
queue< Node >q;
void zhaofu()//找父节点的函数
{
for(int i=1;i<=n;i++)
{
if(a[i].z)
a[a[i].z].f=i;
if(a[i].y)
a[a[i].y].f=i;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].s>>a[i].z>>a[i].y;
zhaofu();
for(int i=1;i<=n;i++)
{
memset(visited,0,sizeof(visited));
q.push(Node(i,0,a[i].s));
while (!q.empty())
{
Node p=q.front();
visited[p.r1]=1;
int i1=a[p.r1].z;
if(i1&&!visited[i1])
{
q.push(Node(i1,p.k1+1,a[i1].s));
sum+=(a[i1].s)*(p.k1+1);
}
int i2=a[p.r1].y;
if(i2&&!visited[i2])
{
q.push(Node(i2,p.k1+1,a[i2].s));
sum+=(a[i2].s)*(p.k1+1);
}
int i3=a[p.r1].f;
if(i3&&!visited[i3])
{
q.push(Node(i3,p.k1+1,a[i3].s));
sum+=(a[i3].s)*(p.k1+1);
}
q.pop();
}
cont=min(cont,sum);
sum=0;
}
cout<<cont<<endl;
}
呜呜呜,第一次交的时候过了4个测试点,最后一个没有过,不知道啥原因,下载了测试样后,经过苦思冥想,终于发现了问题,原来是我代码中cont的初值设置的太小(刚开始我设置的是9999,当节点个数是100组时,所计算的得到的数比9999大,这时,最小的的值成了9999,显然不对 QAQ)然后从网上找到如何设置最大的最小值。最终过了 开心O(∩_∩)O~~