分析
简简单单最短路。
只是要记录一下走了几天罢了,定义为从 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;
} 
京公网安备 11010502036488号