Leetcode-56双周赛<规定时间内到达终点的最小花费>(分层图最短路/DP)
链接:https://leetcode-cn.com/problems/minimum-cost-to-reach-destination-in-time/
思路:
方法1.f[i][j]表示第i时间到达j位置所需要的费用,状态转移方程是:f[i][y]=min(f[i][y],f[i-e[x][y]][x]+p[y]);
方法2:分层图最短路:
代码:
class Solution {
public:
int minCost(int m, vector<vector<int>>& e, vector<int>& p) {
int len=p.size();
vector<vector<int>> f(m+5,vector<int>(len+5,0x3f3f3f3f));
vector<pair<int,int>> s[1005];
for(auto i:e){
int x=i[0],y=i[1],w=i[2];
s[x].emplace_back(y,w);
s[y].emplace_back(x,w);
}
f[0][0]=p[0];
for(int i=0;i<=m;i++){
for(int j=0;j<len;j++){
if(f[i][j]==0x3f3f3f3f)continue;
for(auto [y,z]:s[j]){
if(i+z>m)continue;
f[i+z][y]=min(f[i+z][y],f[i][j]+p[y]);
}
}
}
int ans=0x3f3f3f3f;
for(int i=0;i<=m;i++){
ans=min(ans,f[i][len-1]);
}
return ans==0x3f3f3f3f? -1:ans;
}
};

浙公网安备 33010602011771号