1053 Path of Equal Weight (30 分)

给定一棵带有权重的树,寻找所有从根节点到叶子节点且路径权重和等于给定值的路径。使用深度优先搜索策略,遍历树的节点,当到达叶子节点时检查路径权重,符合条件的路径存入结果数组。最后,对结果数组进行排序并按顺序输出。提供的AC代码展示了如何实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1053 Path of Equal Weight (30 分)

Given a non-empty tree with root R, and with weight W​i​​ assigned to each tree node T​i​​ . 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 W​i​​ (<1000) corresponds to the tree node T​i​​ . 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 {A​1​​ ,A​2​​ ,⋯,A​n​​ } is said to be greater than sequence {B​1​​ ,B​2​​ ,⋯,B​m​​ } if there exists 1≤k<min{n,m} such that A​i​​ =B​i​​ for i=1,⋯,k, and A​k+1​​ >B​k+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");
	}
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值