1053 Path of Equal Weight (30分)

1. 题目

2. 思路

  1. 定义结构体, 并且使用下标作为序号
struct node{
    string weight;
    vector<int> children;
}nodes[101];
  1. 读取数据,并且排序children,方便输出
  2. 使用先序遍历,处理数据

3. 注意点

权重的值很大,用字符串处理,要自己写加法和比较函数

4. 代码

#include<cstdio>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;

struct node{
    string weight;
    vector<int> children;
}nodes[101];

string add(string s1, string s2){
    char a, b;
    if(s1.length() > s2.length()){
        s2.resize(s1.length(), '0');
    }else{
        s1.resize(s2.length(), '0');
    }
    int c = 0;
    string result = "";
    int i = 0;
    for(i=0;i<s1.length();i++){
        a = s1[i]-'0';
        b = s2[i]-'0';
        char res = a+b+c;
        c = res>9?1:0;
        result += res%10+'0';
    }
    if(c == 1){
        result+=1+'0';
    }
    return result;
}

int compare(string s1, string s2){
    if(s1.length() != s2.length()){
        return s1.length() - s2.length();
    }
    string _s1 = s1, _s2 = s2;
    reverse(_s1.begin(), _s1.end());
    reverse(_s2.begin(), _s2.end());
    if(_s1 > _s2){
        return 1;
    }else if(s1 == s2){
        return 0;
    }else{
        return -1;
    }
}

bool cmp(int a, int b) {
    int res = compare(nodes[a].weight, nodes[b].weight);
    return res>0?true:false;
}

void pre(int index, string result, string sum, string weight_sum){
    sum = add(sum, nodes[index].weight);
    string str = nodes[index].weight;
    reverse(str.begin(), str.end());
    int res = compare(sum, weight_sum);
    if(res > 0 ){
        return ;
    }
    if(res == 0){
        if(nodes[index].children.size() == 0){
            result += str;
            printf("%s\n", result.c_str());
        }
        return ;
    }
    if(res < 0){
        if(nodes[index].children.size() == 0){
            return ;
        }
        result += str + " ";
        for(int i=0;i<nodes[index].children.size();i++){
            pre(nodes[index].children[i], result, sum, weight_sum);
        }
    }
}

int main() {
    int N, M;
    char S[31];
    scanf("%d %d %s", &N, &M, S);
    string weight_sum = S;
    reverse(weight_sum.begin(), weight_sum.end());
    vector<string> weights;
    if(N == 0){
        return 0;
    }
    for(int i=0;i<N;i++){
        scanf("%s", S);
        string weight = S;
        reverse(weight.begin(), weight.end());
        weights.push_back(weight);
    }

    int parent, kid_num;
    for(int i=0;i<M;i++){
        scanf("%d %d", &parent, &kid_num);
        int name;
        for(int j=0;j<kid_num;j++){
            scanf("%d", &name);
            nodes[parent].children.push_back(name);
            nodes[name].weight = weights[name];
        }
        sort(nodes[parent].children.begin(), nodes[parent].children.end(), cmp);
    }
    nodes[0].weight = weights[0];

    pre(0, "", "0", weight_sum);
}

原文地址:https://www.cnblogs.com/d-i-p/p/12391299.html

时间: 2024-08-30 04:44:50

1053 Path of Equal Weight (30分)的相关文章

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 tre

PAT 1053. Path of Equal Weight (30)

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 Lis defined to be the sum of the

1053. Path of Equal Weight (30)

dfs函数携带vector形参记录搜索路径 时间限制 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

PAT Advanced 1053 Path of Equal Weight (30) [树的遍历]

题目 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,

PAT:1053. Path of Equal Weight (30) AC

#include<stdio.h> #include<vector> #include<queue> #include<algorithm> using namespace std; const int MAX=1010; int n,m; //n个节点,m个非叶子节点 long long int S; //待测权值 long long int weight[MAX]; //每个节点的权值 vector<int> child[MAX]; //存储

PAT (Advanced Level) 1053. Path of Equal Weight (30)

简单DFS #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; const int maxn=100+10;

PAT甲题题解-1053. Path of Equal Weight (30)-dfs

由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排序,然后再add建边. 水题一个,不多说了. #include <iostream> #include <algorithm> #include <cstdio> #include <string.h> using namespace std; const in

PAT Advanced Level 1053 Path of Equal Weight

1053 Path of Equal Weight (30)(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

pat1053. Path of Equal Weight (30)

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