• 2065. 最大化一张图中的路径价值 Hard


    给你一张 无向 图,图中有 n 个节点,节点编号从 0 到 n - 1 (都包括)。同时给你一个下标从 0 开始的整数数组 values ,其中 values[i] 是第 i 个节点的 价值 。同时给你一个下标从 0 开始的二维整数数组 edges ,其中 edges[j] = [uj, vj, timej] 表示节点 uj 和 vj 之间有一条需要 timej 秒才能通过的无向边。最后,给你一个整数 maxTime 。

    合法路径 指的是图中任意一条从节点 0 开始,最终回到节点 0 ,且花费的总时间 不超过 maxTime 秒的一条路径。你可以访问一个节点任意次。一条合法路径的 价值 定义为路径中 不同节点 的价值 之和 (每个节点的价值 至多 算入价值总和中一次)。

    请你返回一条合法路径的 最大 价值。

    注意:每个节点 至多 有 四条 边与之相连。

    示例 1:

    输入:values = [0,32,10,43], edges = [[0,1,10],[1,2,15],[0,3,10]], maxTime = 49
    输出:75
    解释:
    一条可能的路径为:0 -> 1 -> 0 -> 3 -> 0 。总花费时间为 10 + 10 + 10 + 10 = 40 <= 49 。
    访问过的节点为 0 ,1 和 3 ,最大路径价值为 0 + 32 + 43 = 75 。
    

    示例 2:

    输入:values = [5,10,15,20], edges = [[0,1,10],[1,2,10],[0,3,10]], maxTime = 30
    输出:25
    解释:
    一条可能的路径为:0 -> 3 -> 0 。总花费时间为 10 + 10 = 20 <= 30 。
    访问过的节点为 0 和 3 ,最大路径价值为 5 + 20 = 25 。
    

    示例 3:

    输入:values = [1,2,3,4], edges = [[0,1,10],[1,2,11],[2,3,12],[1,3,13]], maxTime = 50
    输出:7
    解释:
    一条可能的路径为:0 -> 1 -> 3 -> 1 -> 0 。总花费时间为 10 + 13 + 13 + 10 = 46 <= 50 。
    访问过的节点为 0 ,1 和 3 ,最大路径价值为 1 + 2 + 4 = 7 。

    示例 4:

    输入:values = [0,1,2], edges = [[1,2,10]], maxTime = 10
    输出:0
    解释:
    唯一一条路径为 0 。总花费时间为 0 。
    唯一访问过的节点为 0 ,最大路径价值为 0 。
    

    提示:

     ·n == values.length

     ·1 <= n <= 1000

     ·0 <= values[i] <= 108

     ·0 <= edges.length <= 2000

     ·edges[j].length == 3

     ·0 <= uj < vj <= n - 1

     ·10 <= timej, maxTime <= 100

     ·[uj, vj] 所有节点对 互不相同 。

     ·每个节点 至多有四条 边。

     ·图可能不连通。<= 100

    题目大意:计算在给定时间内从0结点出发回到0结点获得的最大收益。

    分析:

    (1)由于每天边花费的时间至少为10,而maxTime最大为100,因此一条合法路径最多经过10条边,又由于每个结点最多只有4条边,因此可以枚举所有合法路径计算最大收益;

    (2)基于(1)中考虑,采用深度优先搜索算法计算合法路径的最大价值。

    1. class Solution {
    2. public:
    3. int ans=0;
    4. void dfs(vectorint,int>>>& gragh,vector<int>& flag,vector<int>& values,int root,int time,int maxTime,int profit){
    5. if(!root) ans=max(ans,profit);
    6. for(auto& [node,nextTime]:gragh[root]){
    7. if(time+nextTime<=maxTime){
    8. if(flag[node]){
    9. flag[node]=false;
    10. dfs(gragh,flag,values,node,time+nextTime,maxTime,profit+values[node]);
    11. flag[node]=true;
    12. }
    13. else dfs(gragh,flag,values,node,time+nextTime,maxTime,profit);
    14. }
    15. }
    16. }
    17. int maximalPathQuality(vector<int>& values, vectorint>>& edges, int maxTime) {
    18. int N=values.size();
    19. vectorint,int>>> gragh(N);
    20. vector<int> flag(N,true);
    21. for(auto& ele:edges){
    22. gragh[ele[0]].emplace_back(ele[1],ele[2]);
    23. gragh[ele[1]].emplace_back(ele[0],ele[2]);
    24. }
    25. flag[0]=false;
    26. dfs(gragh,flag,values,0,0,maxTime,values[0]);
    27. return ans;
    28. }
    29. };
  • 相关阅读:
    redis安装及主从、哨兵配置
    每天写两道(五)合并两个有序链表、最长回文子串
    【C++】设计模式之观察者模式
    爬虫到底难在哪里?
    16-bit 内置基准模数转换器:MS1100
    【AI实用技巧】GPT写sql统计语句
    IntelliJ IDEA - 将指定文件打成jar包
    【Redis】SSM整合Redis&注解式缓存的使用
    【PAT乙级】一百一十道真题刷后大汇总——C/C++
    ubuntu-hadoop伪分布
  • 原文地址:https://blog.csdn.net/m0_60444839/article/details/140098547