目录
多看多做,才能更加熟悉树方面的知识!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!!