1053 Path of Equal Weight (30 分) + 容易忽略的测试测试点

17 篇文章 0 订阅
10 篇文章 0 订阅

题目描述:
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, 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 the following figure: 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 the figure.
(……)

#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
#define MAX 100
using namespace std;

int n, m, s;
struct Node{
    int w;
    vector<int> chlds;
};
Node tree[MAX];

bool cmp(int a, int b) {
    return tree[a].w > tree[b].w;
}


void DFS(int root, int sum, vector<int> path){
    path.push_back(root);
    for(int i=0; i<tree[root].chlds.size(); i++) {
        if(sum+tree[tree[root].chlds[i]].w<s) {
//            path.push_back(tree[root].chlds[i]);
            DFS(tree[root].chlds[i], sum+tree[tree[root].chlds[i]].w, path);
        }
        else if(sum+tree[tree[root].chlds[i]].w==s && tree[tree[root].chlds[i]].chlds.empty()== true) {
            for(int j=0; j<path.size(); j++) {
                cout<<tree[path[j]].w<<' ';
            }
            cout<<tree[tree[root].chlds[i]].w<<endl;
//            return;
        }
    }
    path.pop_back();
}

int cnt=0;

int main() {
//    fstream fin;
//    fin.open("tmp.txt");
//    fin>>n>>m>>s;
//    for(int i=0;i<n;i++) {
//        fin>>tree[i].w;
//    }

    cin>>n>>m>>s;
    for(int i=0;i<n;i++) {
        cin>>tree[i].w;
    }
    for (int i = 0; i < m; ++i) {
        int id, k;
//        fin>>id>>k;
        cin>>id>>k;
        for(int j=0;j<k;j++) {
            int chld;
//            fin>>chld;
            cin>>chld;
            tree[id].chlds.push_back(chld);
        }
        sort(tree[id].chlds.begin(), tree[id].chlds.end(), cmp);
    }
    vector<int> path;
    int sum = tree[0].w;
    // 可能忽略的特殊点:只有根节点,根节点权值=s的情况
    if(n==1&&sum==s)
        cout<<s;
    else
        DFS(0, sum,path);


}

容易忽略的特殊测试点:只有根节点,根节点权值=s的情况

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值