分析
简简单单最短路。
只是要记录一下走了几天罢了,定义为从 1 到 i 走了 j 天的行程花费和欠债人挥霍的钱的最小总和。
。
#include <bits/stdc++.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pii pair<int,int> const int inf = 0x3f3f3f3f; const int maxn = 1110; const int M = 1e9+7; int n,m,k; int a[maxn],dp[maxn][20]; //从1到i走了j天 vector<pii> v[maxn]; bool vis[maxn]; void spfa(int u) { mem(dp,inf);dp[u][0] = 0; queue<int> q;q.push(u); while(q.size()) { u = q.front();q.pop();vis[u] = 0; for(auto i : v[u]) { for(int j = 0; j < k; j++) //枚举走了几天 { if(dp[i.first][j+1] > dp[u][j] + a[j+1] + i.second) { dp[i.first][j+1] = dp[u][j] + a[j+1] + i.second; if(vis[i.first]) continue; vis[i.first] = 1; q.push(i.first); } } } } } signed main() { ios::sync_with_stdio(false);cin.tie(0); cin>>n>>m>>k; for(int i = 1,x,y,z; i <= m; i++) { cin>>x>>y>>z; v[x].push_back({y,z}); v[y].push_back({x,z}); } for(int i = 1; i <= k; i++) cin>>a[i]; spfa(1); int ans = inf; for(int i = 1; i <= k; i++) ans = min(ans,dp[n][i]); if(ans == inf) ans = -1; cout<<ans<<endl; return 0; }