1053 Path of Equal Weight (30 分)
题目大意
给出树的结构和权值,找从根结点到叶子结点的路径上权值和等于给定目标数的路径,并且从大到小输出路径
基本思路
数据结构:
定义二维数组v,下标是结点编号,值是这个结点所有孩子结点的结点编号。
定义数组value,下标是结点编号,值是这个结点的权重
定义数组pathweight存放从根结点到叶子结点的临时路径上的每个结点的权值
基本思路:
读入每个结点的权值。
读入每个非叶子结点的所有孩子结点,每读完一组测试用例,需要把这个结点的所有孩子结点的按照权值的大小从大到小排序(这一步可以保证最终的路径是按照从大到小给出的)。
从根结点编号0开始dfs深搜,求出每一条符合条件的路径。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,m,sum;
vector<int> v[105];//下标是结点编号,值是这个结点所有孩子结点的结点编号
int value[105];//下标是结点编号,值是这个结点的权重
dfs深搜求有没有路径权重为num的路径
vector<int> pathweight;//存放临时路径上的所有结点的权值
void dfs(int root){//形参为当前树的结点编号
//递归边界
if(v[root].size()==0){
pathweight.push_back(value[root]);
int tempsum=0;
for(int i=0;i<pathweight.size();i++){
tempsum+=pathweight[i];
}
if(tempsum==sum){
cout<<pathweight[0];
for(int i=1;i<pathweight.size();i++) cout<<" "<<pathweight[i];
cout<<endl;
}
pathweight.pop_back();
return;
}
pathweight.push_back(value[root]);
for(int i=0;i<v[root].size();i++){
dfs(v[root][i]);
}
pathweight.pop_back();
}
//每一个结点(结点编号)的所有孩子结点(结点编号)按照它的value[结点编号]的大小逆序排序
bool cmp1(int a,int b){
return value[a]>value[b];
}
int main(){
cin>>n>>m>>sum;
//读入每个结点的权值
for(int i=0;i<n;i++) cin>>value[i];
//读入每个非叶子结点的孩子结点
int ans,k,tempans;
for(int i=0;i<m;i++){
cin>>ans>>k;
while(k--){
cin>>tempans;
v[ans].push_back(tempans);
}
sort(v[ans].begin(),v[ans].end(),cmp1);
}
//dfs深搜求有没有路径权重为num的路径
dfs(0);//从根结点编号00开始深搜
return 0;
}