生活随笔
收集整理的這篇文章主要介紹了
LeetCode 2065. 最大化一张图中的路径价值(DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1. 題目
給你一張 無向 圖,圖中有 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
] <= 10^8
0 <= edges
.length
<= 2000
edges
[j
].length
== 3
0 <= uj
< vj
<= n
- 1
10 <= timej
, maxTime
<= 100
[uj
, vj
] 所有節點對 互不相同 。
每個節點 至多有四條 邊。
圖可能不連通。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-path-quality-of-a-graph
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 看見條件 10 <= timej, maxTime <= 100,最多 dfs 10 層就完事了
- 建圖,暴力搜索就是了
class Solution {int maxVal
= 0;
public:int maximalPathQuality(vector
<int>& values
, vector
<vector
<int>>& edges
, int maxTime
) {int n
= values
.size();vector
<unordered_map
<int,int>> g(n
);vector
<int> vis(n
);for(auto& e
: edges
){ g
[e
[0]][e
[1]] = e
[2];g
[e
[1]][e
[0]] = e
[2];}vis
[0] = 1; dfs(g
, values
, maxTime
, vis
, 0, 0, values
[0]);return maxVal
;}void dfs(vector
<unordered_map
<int,int>>& g
, vector
<int>& values
, int maxTime
, vector
<int>& vis
, int idx
, int time
, int val
){if(time
> maxTime
) return; if(idx
==0 && val
> maxVal
){maxVal
= val
;}for(auto& nid_t
: g
[idx
]){ int nid
= nid_t
.first
; int t
= nid_t
.second
; if(vis
[nid
] == 0) {vis
[nid
]++;dfs(g
, values
, maxTime
, vis
, nid
, time
+t
, val
+values
[nid
]);vis
[nid
]--;}else {vis
[nid
]++;dfs(g
, values
, maxTime
, vis
, nid
, time
+t
, val
);vis
[nid
]--;}}}
};
404 ms 23.6 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 2065. 最大化一张图中的路径价值(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。