Pat 甲级 训练真题集 1053!

1053. Path of Equal Weight (30)

​ 时间限制

​ 100 ms

​ 内存限制

​ 65536 kB

​ 代码长度限制

​ 16000 B

​ 判题程序

​ Standard

​ 作者

​ CHEN, Yue

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 Figure 1: 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 Figure 1.

img Figure 1

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 < 230, 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

代码如下,扣了2分,暂未找到,本以为是因为第一行输入的不是头节点,还多写了10行代码用于层次遍历,但是错误并不是这个点。。应该是一个边界点,在此先放会。。。唉。。。。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool greater_than(vector<long> v1,vector<long> v2){
	for(int i=v1.size()-1,j=v2.size()-1;i>=0&&j>=0;){
		if(v1[i]==v2[j]) --j,--i;
		else if(v1[i]>=v2[j]) return v1>v2;
		else  return v1<v2;
	}
	return v1>v2;
}
int main(){
	int n,m;
	long s;
	scanf("%d%d%ld",&n,&m,&s);
	vector<long> weight(n);
	vector<long> sum(n);
	vector<int> non_leaf(n,0);
	vector<int> path(n,-1);
	vector<int>map[100];
	for(int i=0;i<n;++i){
		scanf("%ld",&weight[i]);
		sum[i]=weight[i];
	}
	for(int i=0;i<m;++i){
		int father,num,child;
		scanf("%d%d",&father,&num);
		non_leaf[father]=1;
		for(int j=0;j<num;++j){
			scanf("%d",&child);
			map[father].push_back(child);
			sum[child]=weight[child]+sum[father];
		//	printf("%dss\n",sum[child]);
			path[child]=father;
		}
	}
	/*
	int root;
	vector<int>collection(n,-1);
	while(1){
		int flag=0;
		for(int i=0;i<n;++i){
			if(collection[i]!=1&&non_leaf[i]==1){
				root=i;
				flag=1;
				break;
			}
		}
		if(flag==0) break;
		collection[root]=1;
		for(int i=0;i<map[root].size();++i){
			sum[map[root][i]]=weight[map[root][i]]+sum[root];
			//printf("%d %d %dss\n",root,map[root][i],sum[map[root][i]]);
		}
	}*/
	vector<vector<long>> v_final;
	for(int i=0;i<n;++i){
		if(sum[i]==s&&non_leaf[i]==0){
			int index=i;
			vector<long> v;
			while(path[index]!=-1){				
				v.push_back(weight[index]);
				index=path[index];
			}
			v.push_back(weight[index]);	
			v_final.push_back(v);
		}
	}
	sort(v_final.begin(),v_final.end(),greater_than);
	for(int i=v_final.size()-1;i>=0;--i){
		for(int j=v_final[i].size()-1;j>=0;--j){
			if(j!=0) printf("%ld ",v_final[i][j]);
			else  printf("%ld\n",v_final[i][j]);
		}
	}
	return 0;
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦