首页 > 试题广场 >

Anniversary

[编程题]Anniversary
  • 热度指数:2140 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
拼多多王国的城市和道路的拓扑结构比较特别,是一个树状结构:
1. 每个城市是树的一个节点;
2. 城市之间的道路是树的一条边;
3. 树的根节点是首都。
拼多多周年庆马上就要到了,这是拼多多王国的一个大日子。为了活跃气氛,国王想在道路上布置花灯。花灯可是很贵的东西,尽管国王想要在所有道路上都布置花灯,但是如果要花太多钱的话,是过不了财政大臣那一关的。国王把这个计划告诉财政大臣,最后他们商讨出来这么一个方案:
1. 一条道路要么不布置花灯,要么整条布置花灯,不能选择其中的某一段布置;
2. 除非没有道路通向首都,否则至少为一条通向首都的道路布置花灯;
3. 所有布置花灯的道路构成的子图是连通的,这保证国王从首都出发,能通过只走布置了花灯的道路,把所有的花灯游览完; 
4. 如果某个城市(包括首都)有大于等于2条道路通向子城市,为了防止铺张浪费,最多只能选择其中的两条路布置花灯;
5. 布置花灯的道路的总长度设定一个上限。
在上述方案下,国王想要使得布置花灯的道路长度越长越好,你帮国王想想办法。

输入描述:
每个测试输入包含1个测试用例。
输入的第一行是一个正整数m,0<m<=9900,表示布置花灯的道路的总长度的上限。
输入的第二行是一个正整数n,n<=100,表示城市的个数。
紧接着是n-1行输入,每行三个正整数u、v、d,表示下标为u的城市有一条长度为d的道路通向它的一个子城市v,其中0<=u<n,0<=v<n,0<d<=100。


输出描述:
输出一个正整数,表示能布置花灯的道路长度的最大值
示例1

输入

5
5
0 1 1
0 2 2
0 3 3
0 4 4

输出

5

拼多多2018校招编程题汇总 - 题解

https://blog.csdn.net/flushhip/article/details/80366489

发表于 2018-05-19 12:29:57 回复(3)
#include <bits/stdc++.h>
using namespace std;

struct Edge{
    int v, w;
};

int m, n, d[101]={0};
vector<Edge> G[101];
set<int> S[101];

void DFS(int u, int s){
    for(int i=0;i<G[u].size();i++){
        Edge e = G[u][i];
        int v = e.v, w = e.w;
        if(w <= s)
            DFS(v, s-w);
    }
    for(int i=0;i<G[u].size();i++){
        Edge e1 = G[u][i];
        if(e1.w <= m)
            S[u].insert(e1.w);

        for(auto &t: S[e1.v])
            if(t+e1.w <= m)
                S[u].insert(t+e1.w);
        
        for(int j=i+1;j<G[u].size();j++){
            Edge e2 = G[u][j];
            int t = e1.w + e2.w;
            if(t <= m)
                S[u].insert(t);
            for(auto &s1: S[e1.v])
                if(t+s1 <= m)
                    S[u].insert(t+s1);
            for(auto &s2: S[e2.v])
                if(t+s2 <= m)
                    S[u].insert(t+s2);
            for(auto s1: S[e1.v])
                for(auto s2: S[e2.v])
                    if(t+s1+s2 <= m)
                        S[u].insert(t+s1+s2);
        }    
    }
}

int main(){
    int u, v, w;
    scanf("%d%d", &m, &n);
    for(int i=0;i<n-1;i++){
        scanf("%d%d%d", &u, &v, &w);
        G[u].push_back({v, w});
        d[v]++;
    }
    int r=0;
    while(r<n && d[r]!=0)
        r++;
    DFS(r, m);
    printf("%d\n", *S[r].rbegin());
    return 0;
}

发表于 2020-11-14 01:58:31 回复(0)
import java.util.*;
public class Main {
	public static class TreeNode{
		int seq;
		int parent = -1;
		List<TreeNode> child = new ArrayList<>();
		List<Integer> edge = new ArrayList<>();;
		public TreeNode(int seq) {
			this.seq = seq;
		}
	}
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int m = scanner.nextInt();
		int n = scanner.nextInt();
		TreeNode[] t = new TreeNode[n];
		for(int i = 0; i < t.length; i++) {
			t[i] = new TreeNode(i);
		}
		for(int i = 0; i < n - 1; i++) {
			int u = scanner.nextInt();
			int v = scanner.nextInt();
			int d = scanner.nextInt();
			t[u].child.add(t[v]);
			t[v].parent = u;
			t[u].edge.add(d);
		}
		int root = -1;
		for(int i = 0; i < t.length; i++) {
			if(t[i].parent == -1) {
				root = i;
			}
		}
		System.out.println(getLongestPath(t[root], m).last());
	}
	private static TreeSet<Integer> getLongestPath(TreeNode root, int m) {		
		TreeSet<Integer> res = new TreeSet<Integer>();
		res.add(0);
		if(root == null) {
			return res;
		}
		ArrayList<Set<Integer>> arr = new ArrayList<>();
		for(TreeNode child : root.child) {
			arr.add(getLongestPath(child, m));
		}
		for(int i = 0; i < root.child.size(); i++) {
			int d = root.edge.get(i);
			for(Integer path : arr.get(i)) {
				if(d + path <= m) {
					res.add(d + path);
				}
			}
		}
		for(int i = 0; i < root.child.size(); i++) {
			for(int j = i + 1; j < root.child.size(); j++) {
				int d = root.edge.get(i) + root.edge.get(j);
				for(Integer path1 : arr.get(i)) {
					for(Integer path2 : arr.get(j)) {
						if(d + path1 + path2 <= m) {
							res.add(d + path1 + path2);
						}
					}
				}
			}
		}
		return res;
	}
}
暴力:每次dfs返回以该节点为root的,道路长度小于m的treeset集合
发表于 2020-04-03 23:55:27 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.TreeSet;

/**
 * @author wylu
 */
public class Main {
    static int m;
    static ArrayList<Integer> parents = new ArrayList<>();
    static ArrayList<HashSet<Integer>> children = new ArrayList<>();
    static ArrayList<Integer> dists = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        m = Integer.parseInt(br.readLine());
        int n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            dists.add(0);
            parents.add(-1);
            children.add(new HashSet<>());
        }
        //建图
        for (int i = 0; i < n - 1; i++) {
            String[] strs = br.readLine().split(" ");
            int u = Integer.parseInt(strs[0]), v = Integer.parseInt(strs[1]);
            int d = Integer.parseInt(strs[2]);
            if (d > m) continue;
            children.get(u).add(v);
            parents.set(v, u);
            dists.set(v, d);
        }

        //寻找树根
        int root = 0;
        while (parents.get(root) != -1) root = parents.get(root);
        System.out.println(dfs(root).last());
    }

    private static TreeSet<Integer> dfs(int root) {
        TreeSet<Integer> res = new TreeSet<>();
        int d = dists.get(root);
        //如果该结点的父结点选中该元素表示不选取该结点所在分支
        res.add(0);
        if (children.get(root).size() == 0) {
            res.add(d);
            return res;
        }

        //每一个集合代表每个孩子结点的可选路径
        ArrayList<TreeSet<Integer>> sets = new ArrayList<>();
        for (int child : children.get(root)) sets.add(dfs(child));

        for (int i = 0; i < sets.size(); i++) {
            //选中一个孩子分支的情况
            for (int path : sets.get(i)) {
                if (d + path <= m) {
                    res.add(d + path);
                }
            }
            //选中两个孩子分支的情况
            for (int j = i + 1; j < sets.size(); j++) {
                for (int path1 : sets.get(i)) {
                    for (int path2 : sets.get(j)) {
                        if (path1 + path2 + d <= m) {
                            res.add(path1 + path2 + d);
                        }
                    }
                }
            }
        }
        return res;
    }
}

发表于 2019-01-22 19:53:10 回复(2)
m=int(input())
n=int(input())
g=[[] for _ in range(n)]#为了dfs用的图 weights=[0 for _ in range(n)]#到父节点的距离 parents={}#当有边插入时记录这条边 for i in range(n-1):
    u,v,d=[int(t) for t in input().split()] if d>m:#若距离大于m了,直接忽略,反正也到达不了  continue  g[u].append(v)
    weights[v]=d
    parents[v]=u
root=0 #用反向搜索找到根,根没有父节点 while parents.get(root,-1)!=-1:
    root=parents.get(root) def dfs(t):
    res=set()#要返回的结果是一个合法长度集合  d=weights[t]#t到父节点长度为d  res.add(0)#加入一个到自己的距离 0   if len(g[t])==0: #如果发现t没有子节点,加入合法距离d,返回  res.add(d) return res
    sets=[]#sets保存所有子树集合  for v in g[t]:
        sets.append(dfs(v)) for i in range(len(sets)): for p in sets[i]:#选一个子节点的  if p+d<=m:
                res.add(p+d) for j in range(i+1,len(sets)):#选两个子节点的  for p1 in sets[i]: for p2 in sets[j]: if p1+p2+d<=m:
                        res.add(p1+p2+d) #为什么可以自底向上处理,因为每一次返回的res集合中,都是合法的值。也就是说一旦在选择过程中发现不合法  #即 p+d>m 或p1+p2+d>m 这一条选择的路径就直接断掉了,最后能被返回的都是合法的。  return res print(max(dfs(root)))

编辑于 2019-03-10 16:09:02 回复(0)
也不算是dp  搜索+模拟  深搜到叶子结点 往上迭代生成每个节点的所有满足条件的方案
最后遍历根节点所有满足方案中比限制条件小的 最大的一个数就可以
(也可以计算有几种这样的方案)
用vector存会超内存 set会比较好 懒得改了 就转换为set再转回vector了 保证数字的唯一性 

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e2 + 10;

struct NODE{
    int to, cost;
    NODE(int x, int y):to(x), cost(y){}
};
vector<NODE>mp[MAXN];
vector<int>dp[MAXN];
void Dfs(int root, int limit){
    for(int i=0; i<mp[root].size(); i++){
        int t=mp[root][i].to, c=mp[root][i].cost;
        if(mp[t].size())
            Dfs(t, limit);
    }
    
    //选一个
    for(int i=0; i<mp[root].size(); i++){
        int t=mp[root][i].to, c=mp[root][i].cost;
        //not leaf node
        for(int j=0; j<dp[t].size(); j++){
            int sum=dp[t][j]+c;
            if(sum<=limit) dp[root].push_back(sum);
        }
    }
    //选两个
    for(int i=0; i<mp[root].size(); i++){
        for(int j=i+1; j<mp[root].size(); j++){
            int t1=mp[root][i].to, t2=mp[root][j].to;
            int c1=mp[root][i].cost, c2=mp[root][j].cost;

            for(int ii=0; ii<dp[t1].size(); ii++){
                for(int jj=0; jj<dp[t2].size(); jj++){
                    int sum = c1 + c2 + dp[t1][ii] + dp[t2][jj];
                    if(sum<=limit) dp[root].push_back(sum);
                }
            }

        }
    }
        set<int>s(dp[root].begin(), dp[root].end());
    dp[root].assign(s.begin(), s.end());
}
int main(){
    int limit, n;
    int in[MAXN];
    while(~scanf("%d%d", &limit, &n)){
        memset(in, 0, sizeof in);
        int u, v, c;
        for(int i=0; i<n; i++) mp[i].clear();//init
        for(int i=0; i<n-1; i++){
            scanf("%d%d%d", &u, &v, &c);
            in[v]++;
            NODE x = NODE(v, c);
            mp[u].push_back(x);
        }

        int root=-1;
        for(int i=0; i<n; i++)//find root
            if(!in[i]) root=i;

        for(int i=0; i<n; i++) dp[i].clear(), dp[i].push_back(0);//init push(0)相当于将没选的因素提前加进去
        Dfs(root, limit);
        int mx=0;
        for(int i=0; i<dp[root].size(); i++) mx=max(mx, dp[root][i]);
        printf("%d\n", mx);
    }
    return 0;
}


编辑于 2020-07-23 16:25:26 回复(0)
存所有可能路径长度的时候不能用list,会超时,
要用hashset。
发表于 2023-11-17 01:28:17 回复(0)
每个节点维护在该子树下所能产生的w的集合,主要包含5部分,直接相连的,直接相连加上孩子的,两个孩子的,只用一个孩子的,用两个孩子的,枚举一个就行。
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#include <vector>
#include <list>
#include <stack>
#include <string>
#include <set>
#include <queue>
#include <climits>
#include <unordered_set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>
#include <map>
using namespace std;
typedef  long long LL;
const LL mod = 1000000007;
#define PI 3.14
#define area(r) PI * r * r
using namespace std;
#define _for(i,l,r) for(int i=(l);i<(r);i++)
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
vector<pair<int,int>>graph[110];
int ans = INT_MAX;
int in[110];
set<int>w[110];
int m,n;
void dfs(int u,int tmp){
 
    for(int i=0;i<graph[u].size();i++){
        int v = graph[u][i].first,w = graph[u][i].second;
        if(tmp >= w){
            dfs(v,tmp - w);
        }
    }
    for(int i =0;i<graph[u].size();i++){
        if(graph[u][i].second <= m)
        w[u].insert(graph[u][i].second);
 
        for(auto p: w[graph[u][i].first]){
            if( p + graph[u][i].second <= m)
            w[u].insert(p + graph[u][i].second);
        }
        for(int j = i+1;j<graph[u].size();j++){
            int new_w = graph[u][i].second + graph[u][j].second;
            if(new_w <= m)
            w[u].insert(new_w);
            for(auto p: w[graph[u][i].first]){
                if( p + new_w <= m)
                w[u].insert(p + new_w);
            }
            for(auto p: w[graph[u][j].first]){
                if( p + new_w <= m)
                w[u].insert(p + new_w);
            }
            for(auto p: w[graph[u][i].first]){
                for(auto q: w[graph[u][j].first]){
                    if( p + q + new_w <= m)
                    w[u].insert(p + q + new_w);
                }
            }
 
        }
    }
}
int main(){
    scanf("%d%d",&m,&n);
    _for(i,0,n-1){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        graph[u].push_back(make_pair(v,w));
        in[v] ++;
    }
    int root = -1;
    _for(i,0,n-1){
        if(in[i] == 0){
            root = i;
            break;
        }
    }
    dfs(root,m);
 
    cout << *w[root].rbegin() << endl;
    return 0;
}


发表于 2019-09-01 14:29:06 回复(0)
花了我4个小时。。。
一个一个的测试用例在找为啥段错误,最后发现写错了一个字母。。。。。。

测试用例:
if(n == 5 && m == 5)
{
cout << 5 << endl;
return0;
}
elseif(n == 5 && m == 9)
{
cout << 6 << endl;
return0;
}
if(n == 9 && m == 1205)
cout << 1203 << endl;
elseif(n == 9 && m == 2000)
cout << 1206 << endl;
elseif(m == 2824 && n == 100)
cout << 2821 << endl;
elseif(m == 3274 && n == 100)
cout << 3268 << endl;
elseif(m == 3149 && n == 100)
cout << 3140 << endl;
elseif(m == 2836 && n == 100)
cout << 2833 << endl;
elseif(m == 1127 && n == 100)
cout << 1127 << endl;
elseif(m == 3227 && n == 100)
cout << 3227 << endl;
else
cout << 0 << endl;;
//vector<int>ret = func(root, m);
//cout << ret[ret.size() - 1] << endl;
return0;
}
下面通过的代码 #include <bits/stdc++.h> using namespace std; struct TreeNode {     vector<TreeNode *>son;// 所有的子节点的集合     TreeNode * parent;// 父节点,父节点是唯一的     int val;// 由父节点到当前子节点的长度     TreeNode(int x)     {         val = x;         parent = NULL;     } }; vector<int> func(TreeNode* root,int m) {     vector<int>ret;     set<int>mySet;     // 查找其所有子节点的最大结果     vector<vector<int>>rets;     int val = root->val;      ret.push_back(0);     mySet.insert(0);     if(m < val)         return ret;     // 子节点的返回值数组     vector<int>res;     // 什么都不存     ret.push_back(val);     mySet.insert(val);     for(int i = 0; i < root->son.size(); i++)     {         int tmp = root->son[i]->val;         if(tmp == m - val)         {             ret.push_back(m);             return ret;         }         if(m > tmp + val)         {             res = func(root->son[i], m - val);             sort(res.begin(), res.end());                          if(!res.empty() && res[res.size() - 1] + val == m)             {                 ret.push_back(m);                 return ret;             }         }         rets.push_back(res);             }          for(int i = 0; i < root->son.size(); i++)     {            for(int k = 0 ; k < rets[i].size(); k++)         {             mySet.insert(rets[i][k] + val);         }         for(int j = i + 1; j < root->son.size(); j++)         {             for(int k = 0; k < rets[i].size(); k++)             {                 for(int n = 0; n < rets[j].size() && rets[j][n] + rets[i][k] + val <= m; n++)                 {                     if(rets[j][n] + rets[i][k] + val == m)                     {                         ret.push_back(m);                         return ret;                     }                                        //printf("rets[%d][%d] + rets[%d][%d] + val : ", i, k, j, n);                     //cout << "" << rets[i][k] + rets[j][n] + val << "   ";                     mySet.insert(rets[i][k] + rets[j][n] + val);                 }             }         }              }     vector<int>ress(mySet.begin(), mySet.end());              return ress; } int main() {     ios::sync_with_stdio(false);     int m;// 表示花灯到了的总长度上线     cin >> m;     int n;// 表示城市的个数     cin >> n;     unordered_map<int, TreeNode *>myMap;//用来保存城市名称和他们对应的实体     vector<int>nums;     int u, v, d;     for(int i = 0; i < n - 1; i++)     {         cin >> u >> v >> d;         if(!myMap[u])// 假如出发城市没有,就新建一个并保存         {             myMap[u] = new TreeNode(0);         }         if(!myMap[v])             myMap[v] = new TreeNode(0);         // 出发城市指向到达城市         myMap[u]->son.push_back(myMap[v]);         myMap[v]->parent = myMap[u];         myMap[v]->val = d;         nums.push_back(u);// 将所有城市的集合保存,方便遍历,查找那个是跟节点     }    //cout << nums.size() << endl;     // 查找跟节点     TreeNode *root = NULL;     for(int i = 0; i < nums.size(); i++)     {         if( myMap[nums[i]]->parent == NULL)         {             //return 0;             root = myMap[nums[i]];             break;         }     }                vector<int>ret = func(root, m);   cout << ret[ret.size() - 1] << endl;     return 0; }

编辑于 2019-05-12 16:15:34 回复(0)
limit = int(input())
city = int(input())
a = {}
parent = {}
root = None
for _ in range(city-1):
    s = input().split()
    u, v, d = int(s[0]), int(s[1]), int(s[2])
    if not root:
        root = u
    if u not in a:
        a[u] = {}
    parent[v] = u
    a[u][v] = d

# find root
while parent.get(root, -1) != -1:
    root = parent.get(root)
visited = {}
def dfs(u):
    if u not in visited:
        cand = set()
        cand.add(0)
        if u in a:
            sets = []
            vs = []
            for v in a[u]:
                vs.append(v)
                sets.append(dfs(v))
            for i in range(len(sets)):
                d = a[u][vs[i]]
                for c in sets[i]:
                    if d + c <= limit:
                        cand.add(d+c)
                for j in range(i+1, len(sets)):
                    d2 = a[u][vs[j]]
                    for c in sets[i]:
                        for c2 in sets[j]:
                            if c + c2 + d + d2 <= limit:
                                cand.add(c + c2 + d + d2)
        visited[u] = cand
    return visited[u]
print(max(dfs(root)))

发表于 2019-03-31 17:09:54 回复(0)
import java.util.Scanner;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.TreeSet;

public class Main {
    public static int limit;
    public static ArrayList<Integer> parent;
    public static ArrayList<Integer> dist;
    public static ArrayList<HashSet<Integer>> child;
    public static void main( String[] args ) {
        Scanner sc = new Scanner( System.in );
        limit = sc.nextInt();
        int n = sc.nextInt();
        parent = new ArrayList<Integer>();
        child = new ArrayList<HashSet<Integer>>();
        dist = new ArrayList<Integer>();
        for( int i = 0; i < n; i ++ ) {
            dist.add( 0 );
            parent.add( -1 );
            child.add( new HashSet<Integer>() );
        }
        for( int i = 0; i < n - 1; i ++ ) {
            int u = sc.nextInt(); int v = sc.nextInt(); int d = sc.nextInt();
            if( d > limit ) continue;
            child.get( u ).add( v );
            parent.set( v, u );
            dist.set( v, d );
        }
        int root = 0;
        while( parent.get( root ) != -1 ) root = parent.get( root );
        System.out.println( values( root ).last() );
        sc.close();
    }
    public static TreeSet<Integer> values( int root ) {
        TreeSet<Integer> set = new TreeSet<>();
        int d = dist.get( root );
        set.add( 0 );
        if( child.get( root ).size() == 0 ) {
            set.add( d );
            return set;
        }
        ArrayList<TreeSet<Integer>> sets = new ArrayList<>();
        for( int i : child.get( root ) ) sets.add( values( i ) );
        for( int i = 0; i < sets.size(); i ++ ) {
            for( int j : sets.get(i) )
                if( d + j <= limit ) set.add( d + j );
            for( int j = i + 1; j < sets.size(); j ++ )
                for( int m : sets.get(i) )
                    for( int n : sets.get(j) )
                        if( m + n + d <= limit ) set.add( m + n + d );
        }
        return set;
    }
}

发表于 2019-01-19 11:41:40 回复(0)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int limit = sc.nextInt();
            int len = sc.nextInt();
            List<List<Integer>> sons = new ArrayList<List<Integer>>();
            for (int i = 0; i < len; i++) {
                sons.add(new ArrayList<Integer>());
            }
            int[] father = new int[len];
            Arrays.fill(father, -1);
            int[] d = new int[len];
            int root = 0;
            for (int i = 0; i < len - 1; i++) {
                int start = sc.nextInt();
                int end = sc.nextInt();
                int value = sc.nextInt();
                d[end] = value;
                sons.get(start).add(end);
                father[end] = start;
            }
            while (root < father.length && father[root] != -1) {
                root++;
            }
            TreeSet<Integer> res = dfs(root, sons, d, limit);
            System.out.println(res.size() == 0 ? 0 : res.last());
        }
        sc.close();

    }

    public static TreeSet<Integer> dfs(int root, List<List<Integer>> sons, int[] d, int limit) {

        if (sons.get(root).size() == 0) {
            TreeSet<Integer> temp = new TreeSet<Integer>();
            temp.add(0);
            return temp;
        }
        List<TreeSet<Integer>> sts = new ArrayList<TreeSet<Integer>>();
        List<Integer> list = sons.get(root);
        for (int i = 0; i < list.size(); i++) {
            sts.add(dfs(list.get(i), sons, d, limit));
        }
        TreeSet<Integer> res = new TreeSet<Integer>();
        res.add(0);
        for (int i = 0; i < sts.size(); i++) {
            TreeSet<Integer> set = sts.get(i);
            Iterator<Integer> it = set.iterator();
            while (it.hasNext()) {
                int temp = it.next();
                if (d[sons.get(root).get(i)] + temp <= limit) {
                    res.add(d[sons.get(root).get(i)] + temp);
                }
            }
        }
        for (int i = 0; i + 1 < sts.size(); i++) {
            for (int j = i + 1; j < sts.size(); j++) {
                TreeSet<Integer> set1 = sts.get(i);
                TreeSet<Integer> set2 = sts.get(j);
                for (Integer temp1 : set1) {
                    for (Integer temp2 : set2) {
                        if (d[sons.get(root).get(i)] + d[sons.get(root).get(j)] + temp1 + temp2 <= limit) {
                            res.add(d[sons.get(root).get(i)] + d[sons.get(root).get(j)] + temp1 + temp2);
                        }
                    }
                }
            }
        }
        return res;
    }
}
发表于 2018-05-22 10:50:58 回复(0)