PAT 1053 Path of Equal Weight
2016-06-17 10:58
519 查看
10 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.
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 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:
Sample Output:
1053. Path of Equal Weight (30)
时间限制10 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.
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
题意:就是让你从树根开始向下找到所有数字和为ans的所有路径,打出这些路径上每个点对应的值得大小,并且路径是按照路径上值的大小排序的
思路:深搜,从根节点开始深搜它相邻的结点,记录到优先队列里面,这样就不虚要排序了,到时候直接输出路径,进行深搜
AC代码
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <queue> using namespace std; int gra[105][105];//每个节点相邻的边是否存在 int val[105];//每个节点的值 int n,m,ans;//n个结点,m个有叶子,ans为路径上的值 int step[205];//记录路径上的值 int vist[105];//当前路径有没有访问过这个点 struct point {//定义优先队列,值大的在前 int value; int pos; bool operator < (const point &a) const { return value < a.value; } } p; void dfs(int sum,int ct,int nod) { if(sum == ans) { int tag = 0; for(int i = 0; i < n; i++) {//判断这个根下面是不是含有叶子 if(gra[nod][i] && !vist[i]) { tag =1; break; } } if(!tag) {//没有的话,输出路径上的值 printf("%d",step[0]); for(int i = 1; i < ct; i++) { printf(" %d",step[i]); } printf("\n"); return; } } if(sum > ans) { return; } priority_queue <point>q; for(int i = 0; i < n; i++) {//和当前nod相邻并且没有加入该路径 if(gra[nod][i] && !vist[i]) { p.value = val[i]; p.pos = i; q.push(p); } } while(!q.empty()) { p = q.top(); q.pop(); int i = p.pos; vist[i] = 1; step[ct] = val[i]; dfs(sum+p.value,ct+1,i); vist[i] = 0; } } int main() { cin >> n >> m >> ans; memset(vist,0,sizeof(vist)); memset(gra,0,sizeof(gra)); for(int i = 0; i < n; i++) { cin >> val[i]; } int s,e,k; while(m--) { cin >> s >> k; while(k--) { cin >> e; gra[s][e] = 1; gra[e][s] = 1; } } step[0] = val[0]; vist[0] = 1; dfs(val[0],1,0); return 0; }
相关文章推荐
- 比较详细Python正则表达式操作指南(re使用)
- 智能科学课程考核的相关
- 失败一定有原因 成功一定有方法
- JAVA集合详解(Collection和Map接口)
- Android WebView学习
- Spring注解声明的事务@Transaction出现异常后没有回滚
- linux--linux下统计文件夹文件数量
- Android面试题目及其答案
- js 递归下的循环
- Lua的table库函数insert、remove、concat、sort详细介绍
- 渗透思路全方面总结
- 微信热传的 100+ 经典技术文章
- hiho1091_clicker背包问题
- apache启用gzip压缩方法--转载自http://www.cnblogs.com/linzhenjie/archive/2013/03/05/2943635.html
- HTTP/2在一个TCP连接里以frame封装的数据包方式多工传输。
- iOS 本地OC与JS互相调用并传值
- 多种AI技术的综合运用和强大的计算能力共同造就了沃森(节选)
- infix prefix postfix的区别
- C++ 百炼成钢20
- Apache多网站虚拟目录域名