1053. Path of Equal Weight (30)
2015-09-02 13:13
393 查看
Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. Theweight 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.
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:
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 begreater 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:
Sample Output:
按要求输入树,然后检索根节点到叶子结点路径长等于指定长度的路径,按一定排序,输出沿途途径。
调用的元素时,需要初始化, 并且->first 代表map<first,second>中的first,->second 代表其中的second。这是map容器和其他容器不同的地方。
——————————
今天又看了下,发现排序算法有点蛋疼,直接从前到后,从大倒下排序输出即可,而且也不用 专门建一个容器存放vector的,因为vector本身就是容器。
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.
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 begreater 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
按要求输入树,然后检索根节点到叶子结点路径长等于指定长度的路径,按一定排序,输出沿途途径。
调用的元素时,需要初始化, 并且->first 代表map<first,second>中的first,->second 代表其中的second。这是map容器和其他容器不同的地方。
——————————
今天又看了下,发现排序算法有点蛋疼,直接从前到后,从大倒下排序输出即可,而且也不用 专门建一个容器存放vector的,因为vector本身就是容器。
#include <iostream> #include <string> #include <vector> #include <map> #include<algorithm> using namespace std; class tree { public: int weight; int num; tree *father; bool haschild; tree(int w,int n) { haschild=false; father=NULL; weight=w; num=n; } tree() { haschild=false; father=NULL; } }; struct out { vector<int> t; }; bool compare(out a,out b); int main() { map<int,tree> trees; int N,M,S; cin>>N>>M>>S; for(int i=0;i<N;i++)//存入 { int w; cin>>w; tree t=tree(w,i); trees[i]=t; } for(int i=0;i<M;i++)//找个各自的父亲节点 { int num,k; cin>>num>>k; map<int,tree>::iterator tfather=trees.find(num); tfather->second.haschild=true; for(int j=0;j<k;j++) { int child; cin>>child; map<int,tree>::iterator tchild=trees.find(child); tchild->second.father=&tfather->second; } } vector <out> rightout; for(int i=0;i<N;i++) { int allweight=0; map<int,tree>::iterator thistree=trees.find(i);//找到节点 if(thistree->second.haschild==true)//只对叶子结点检索 continue; out count;//存入输出结果 tree fathertree=thistree->second; count.t.push_back(fathertree.weight); allweight+=fathertree.weight; //计算路经长,为了方便排序,这里用了三个容器,一个是记录路径的vector,一个是存有vector的结点,一个是存有结点的vector,略乱 while(fathertree.father!=NULL) { fathertree=*fathertree.father; count.t.push_back(fathertree.weight); allweight+=fathertree.weight; } if(S==allweight) { rightout.push_back(count); } } sort(rightout.begin(),rightout.end(),compare); for(int i=0;i<rightout.size();i++) { int j; for(j=0;j<rightout[i].t.size()-1;j++) cout<<rightout[i].t[rightout[i].t.size()-j-1]<<" ";//这里要当心不要多输出一个空格,为了这个调了5分钟= = cout<<rightout[i].t[rightout[i].t.size()-j-1]<<endl; } system("pause"); return 0; } bool compare(out a,out b)//按要求排序 { int i=0; while(a.t[a.t.size()-i-1]==b.t[b.t.size()-i-1]&&i<a.t.size()-1&&i<b.t.size()-1)//这里要注意长度限制,不然很容易越界! i++; return a.t[a.t.size()-i-1]>b.t[b.t.size()-i-1]; }
相关文章推荐
- Android之使用Http协议实现文件上传功能
- Spark RDD API详解(一) Map和Reduce
- 菜鸟说给菜鸟听之Beginning Linux Programming——Chapter1(1)
- Python中map()函数浅析
- Android使用Google Map浅谈
- 注册表的组织结构
- sqlserver FOR XML PATH 语句的应用
- SQLSERVER的非聚集索引结构深度理解
- 调整SQLServer2000运行中数据库结构
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#中类与结构的区别实例分析
- C#枚举类型与结构类型实例解析
- javascript实现表现、结构、行为分离的选项卡效果!
- Erlang中的映射组Map详细介绍
- C++ Vector用法详解
- c++中map的基本用法和嵌套用法实例分析
- set_include_path在win和linux下的区别