洛谷 p1364 题解

这是一道广搜的题目   题目本身不难  基本思路:先定义一个结构,结构中有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~~

猜你喜欢

转载自blog.csdn.net/qq_40938077/article/details/80024129