力扣3372.连接两棵树后最大目标节点数目I

力扣3372.连接两棵树后最大目标节点数目I

题目

题目解析及思路

题目要求对于第一棵树中每个节点,使其与第二棵树的一个节点连边,返回最多的目标节点数目

目标节点:距离<=k

暴力枚举第二棵树中每个节点到其他节点距离d<=k-1的最大数量max2

再枚举第一棵树中每个节点求目标节点数量dfs(edges1),二者相加为答案ans = max2 + dfs

代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> build_tree(vector<vector<int>>& edges){
        vector<vector<int>> g(edges.size() + 1);
        for(auto& t:edges){
            //邻接矩阵
            int x = t[0],y = t[1];
            g[x].push_back(y);
            g[y].push_back(x);
        }
        return g;
    }

    int dfs(int x,int fa,int d,vector<vector<int>>& g,int k){
        if(d > k)
            return 0;
        int cnt = 1;
        //遍历
        for(int y:g[x])
            //不是父节点就继续dfs
            if(y != fa)
                cnt += dfs(y,x,d+1,g,k);
        return cnt;
    }

    vector<int> maxTargetNodes(vector<vector<int>>& edges1, vector<vector<int>>& edges2, int k) {
        int max2 = 0;
        if(k > 0){
            //建立邻接矩阵
            auto g = build_tree(edges2);
            for(int i=0;i<edges2.size()+1;i++)
                //求距离k-1的最大数目
                max2 = max(max2,dfs(i,-1,0,g,k-1));
        }

        auto g = build_tree(edges1);
        vector<int> ans(edges1.size() + 1);
        for(int i=0;i<ans.size();i++){
            ans[i] = dfs(i,-1,0,g,k) + max2;
        }
        return ans;
    }
};
相关推荐
v_348360876234 分钟前
Android native端 堆栈打印
android·算法
residual_fan34 分钟前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea1 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询2 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun613 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun613 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
302wanger5 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼5 小时前
CF——错题的集合
算法
SL_staff5 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈
陌シ未央ゞ5 小时前
基于BM25算法和RRF实现的混合索引(java版)
人工智能·spring boot·后端·算法