码迷,mamicode.com
首页 > 其他好文 > 详细

1053 Path of Equal Weight (30分)

时间:2020-03-01 20:01:12      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:string   child   取数据   ring   code   %s   return   图片   ++   

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);
}

1053 Path of Equal Weight (30分)

标签:string   child   取数据   ring   code   %s   return   图片   ++   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!