1053. Path of Equal Weight (30)

本文深入探讨了深度学习技术在音视频处理领域的应用,涵盖了从图像处理到AR特效,再到AI音视频处理等多个方面,展示了深度学习如何通过神经网络实现复杂任务的自动化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

树的结构可以用邻接表存储,然后使用dfs很容易可以找到满足要求的一些路径,然后就是对这些路径按要求进行排序,使用sort很容易就可以完成。

#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
void dfs(int root,int total_weight);
bool compare(vector<int> a,vector<int> b);
vector<int> weight;
map<int,vector<int> > tree;
vector<vector<int> > record;
vector<int> weight_record;
int target,cnt=0;
int main()
{
    int num_node,num_none_leaf_node;
    cin >>num_node >>num_none_leaf_node >>target;
    for(int i=0;i<num_node;i++)
    {
        int tmp;
        cin >>tmp;
        weight.push_back(tmp);
    }
    for(int i=0;i<num_none_leaf_node;i++)
    {
        int root,num;
        cin >>root >>num;
        for(int j=0;j<num;j++)
        {
            int tmp;
            cin >>tmp;
            tree[root].push_back(tmp);
        }
    }
    weight_record.push_back(weight[0]);
    dfs(0,weight[0]);
    sort(record.begin(),record.end(),compare);
    int max_step=record.size();
    for(int i=0;i<max_step;i++)
    {
        vector<int> tmp=record[i];
        cout <<tmp[0];
        for(int j=1;j<tmp.size();j++)
            cout <<" "<<tmp[j];
        cout <<endl;
    }
    return 0;
}
void dfs(int root,int total_weight)
{
    //到达一个叶子节点
    if(tree.find(root)==tree.end())
    {
        if(total_weight==target)
        {
            record.push_back(weight_record);
            cnt++;
        }
        return;
    }
    //没有到达叶子节点,但是权重已经大于target,终止dfs
    if(total_weight>=target)
        return;
    //没有到达叶子节点,但是权重仍然小于target
    int num_child=tree[root].size();
    for(int i=0;i<num_child;i++)
    {
        int tmp=tree[root].at(i);
        int a=total_weight+weight[tmp];
        weight_record.push_back(weight[tmp]);
        dfs(tmp,a);
        weight_record.pop_back();
    }
}
//降序排列
bool compare(vector<int> a,vector<int> b)
{
    int length=min(a.size(),b.size());
    for(int i=0;i<length;i++)
        if(a[i]!=b[i])
            return a[i]>b[i];
    return a.size()>b.size();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值