1053. Path of Equal Weight (30)

来源:互联网 发布:文娱小说推荐知乎 编辑:程序博客网 时间:2024/06/12 01:12

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 Lis 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 = Bifor i=1, ... k, and Ak+1 > Bk+1.

Sample Input:
20 9 2410 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 200 4 01 02 03 0402 1 0504 2 06 0703 3 11 12 1306 1 0907 2 08 1016 1 1513 3 14 16 1717 2 18 19
Sample Output:
10 5 2 710 4 1010 3 3 6 210 3 3 6 2
28分!

用的是并查集。找到根节点,然后遍历到头结点累加就行。

存储我用的是字符串存储。

我用深搜做一遍还是错想用的点。感觉错的就是输出上

没找到错的点在哪。

#include<iostream>  #include<cstring>  #include<cstdio>  #include<queue>  #include<stack>  #include<algorithm>  #include<vector> #include<map>using namespace std;int n,m,s;int value[101];int father[101];int v[101]={0},cnt=0;vector<string> vec;bool cmp(string a,string b){return a>b;}int main(){cin>>n>>m>>s;for(int i=0;i<n;i++){scanf("%d",&value[i]);}for(int i=0;i<101;i++) father[i]=i;for(int i=0;i<m;i++){int id,k;scanf("%d %d",&id,&k);for(int j=0;j<k;j++){int num;scanf("%d",&num);father[num]=id;}}for(int i=0;i<n;i++){int fz=i;while(fz!=father[fz]){fz=father[fz];v[fz]=1;}}for(int i=0;i<n;i++){if(v[i]==0){    int sum=0;int fz=i;sum+=value[fz];vector<int> vv;vv.push_back(value[fz]);while(fz!=father[fz]){fz=father[fz];sum+=value[fz];vv.push_back(value[fz]);if(sum>s) break;}if(sum==s){string str="";for(int j=vv.size()-1;j>=0;j--){char fz_s[10];sprintf(fz_s,"%d",vv[j]);string ss=fz_s;str+=ss+" ";}vec.push_back(str);}}}sort(vec.begin(),vec.end(),cmp);for(int i=0;i<vec.size();i++){string f=vec[i];for(int j=0;j<f.size()-1;j++) cout<<f[j];cout<<endl;}return 0;}