目录

题目解释:

解题思路:

ac代码:

多看多做,才能更加熟悉树方面的知识!Very important!!


1053 Path of Equal Weight (30 分)

题目地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805424153280512

 

题目解释:


对于每个结点,上面是结点的编号,用二位数字表示(two-digit),下面是该结点的权值,先寻找所有的路径,使路径上所有结点的权值之和是给定的s,并按非递减顺序输出这些路径上经过的权值。

如果对于两条路径,A1=B1,.....Ai-1=B i-1,Ai>Bi那么A路径比B路径大.

 

解题思路:


1)用path[i]存路径上第i个结点的编号,最后在一次输出编号对应的weight,即node[path[i]].weight

2)对于某个结点的子孩子,要先对这些子孩子的weight排序,即现遍历weight大的子孩子,最后也先输出weight大的子孩子,即实现了非递减得输出路径

3)dfs遍历树

 

ac代码:


#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define maxn 110
using namespace std;
struct NODE{
    int weight;
    vector<int> child;
}node[maxn];//结点数组
bool cmp(int a,int b)//weight从大到小输出,先排序
{
    return node[a].weight>node[b].weight;
}
int n,m,s;
int path[maxn];//path[i]表示路径上第i个结点的编号
void dfs(int index,int numnode,int sum)//访问结点为index,当前结点个数numnode,和sum
{
    if(sum>s) return ;
    if(sum==s)
    {
        if(node[index].child.size()!=0)//非叶子结点
            return ;
        for(int i=0;i<numnode;i++)
        {
            printf("%d",node[path[i]].weight);
            if(i<numnode-1) printf(" ");
            else printf("\n");
        }
        return ;
    }
    for(int i=0;i<node[index].child.size();i++)
    {
        int child=node[index].child[i];
        path[numnode]=child;
        dfs(child,numnode+1,sum+node[child].weight);
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<n;i++)
        scanf("%d",&node[i].weight);
    int id,k,child;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&id,&k);
        for(int j=0;j<k;j++)
        {
            scanf("%d",&child);
            node[id].child.push_back(child);//向vector中存入孩子
        }
        sort(node[id].child.begin(),node[id].child.end(),cmp);//对每一个结点的子孩子们的weight排序
    }
    path[0]=0;
    dfs(0,1,node[0].weight);
    return 0;
}

 

多看多做,才能更加熟悉树方面的知识!Very important!!