1053 Path of Equal Weight (30 分)
Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti . The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L.
Now given any weighted tree, you are supposed to find all the paths with their weights equal to a given number. For example, let’s consider the tree showed in the following figure: for each node, the upper number is the node ID which is a two-digit number, and the lower number is the weight of that node. Suppose that the given number is 24, then there exists 4 different paths which have the same given weight: {10 5 2 7}, {10 4 10}, {10 3 3 6 2} and {10 3 3 6 2}, which correspond to the red edges in the figure.
Input Specification:
Each input file contains one test case. Each case starts with a line containing 0<N≤100, the number of nodes in a tree, M (<N), the number of non-leaf nodes, and 0<S<2^30 , the given weight number. The next line contains N positive numbers where Wi (<1000) corresponds to the tree node Ti . Then M lines follow, each in the format:
ID K ID[1] ID[2] … ID[K]
where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID’s of its children. For the sake of simplicity, let us fix the root ID to be 00.
Output Specification:
For each test case, print all the paths with weight S in non-increasing order. Each path occupies a line with printed weights from the root to the leaf in order. All the numbers must be separated by a space with no extra space at the end of the line.
Note: sequence {A1 ,A2 ,⋯,An } is said to be greater than sequence {B1 ,B2 ,⋯,Bm } if there exists 1≤k<min{n,m} such that Ai =Bi for i=1,⋯,k, and Ak+1 >Bk+1 .
Sample Input:
20 9 24
10 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 2
00 4 01 02 03 04
02 1 05
04 2 06 07
03 3 11 12 13
06 1 09
07 2 08 10
16 1 15
13 3 14 16 17
17 2 18 19
Sample Output:
10 5 2 7
10 4 10
10 3 3 6 2
10 3 3 6 2
题目大意:
给定一棵树的信息和目标权重。求从根结点到叶子结点路径上的权重和等于目标权重的路径,按字典序输出。
算法分析:
weight数组存储每个结点的权重信息,vector v[]存储每个结点的邻接点信息。进行深度优先搜索,vector temp存储遍历时的实时路径,遍历到叶子结点时,判断此时的权重和是否等于目标权重,若是,压入vector数组path中。最后对path数组中的路径进行排序,按序输出
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,s,cnt;
int weight[110];
vector<int> path[500],v[110],temp;
void DFS(int index,int sum){
sum+=weight[index];
temp.push_back(weight[index]);
if(v[index].size()==0){
if(sum==s){
path[cnt++]=temp; //cnt同时记录了路径数量
}
temp.pop_back();//遍历到叶结点时,将其弹出
}
else{
for(int i=0;i<v[index].size();i++)
DFS(v[index][i],sum);
temp.pop_back();//将一个结点的子结点遍历完后,将其弹出
}
}
int cmp(vector<int> a,vector<int> b){//对路径进行排序
int min=a.size();
if(b.size()<min)
min=b.size();
for(int i=0;i<min;i++){
if(a[i]!=b[i])
return a[i]>b[i];
}
}
int main()
{
cin>>n>>m>>s;
for(int i=0;i<n;i++)
scanf("%d",&weight[i]);//存储每个结点的权重
int node,num,index;
for(int i=0;i<m;i++){
scanf("%d %d",&node,&num);
for(int j=0;j<num;j++){
scanf("%d",&index);
v[node].push_back(index);//存储每个结点的邻接点
}
}
DFS(0,0);
sort(path,path+cnt,cmp);
for(int i=0;i<cnt;i++){
int flag=0;
for(int j=0;j<path[i].size();j++){
if(flag==1)
printf(" ");
printf("%d",path[i][j]);
flag=1;
}
printf("\n");
}
}