题意:
有n个城市,小明再1号城市,它的欠债人在n号城市,城市之间有道路连接,不过需要交路费,而且欠债人每天都会花费一些钱,每天你只能走一条道路从一个城市到另一个城市,求你最少的花费(路费+欠债人花费)为多少?
思路:
最短路的变形题,多了个欠债人每天的花费。
用val[i][j]表示第i天在第j个城市的最少花费。
松弛操作条件为:val[t+1][to]>cost+a[t+1]+val[t][v](t<k);
代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll inf=1000000007;
struct w
{
int to, cost;
} w;
struct p
{
int v, val, day;
} p;
vector<struct w>g[10005];
int val[15][1005];
int n, k, a[105], ans=inf;
int dij()
{
fill(val[0],val[0]+15*1005,inf);
p.v=1;
p.val=0;
p.day=0;
val[0][1]=0;
queue<struct p> q;
q.push(p);
while(!q.empty())
{
p=q.front();
q.pop();
if(p.val>val[p.day][p.v])
continue;
int v=p.v, t=p.day, va=p.val;
if(t<=k&&v==n)
{
ans=min(ans,va);
}
for(int i=0; i<g[v].size(); i++)
{
int to=g[v][i].to, cost=g[v][i].cost;
if(t<k&&val[t+1][to]>cost+a[t+1]+val[t][v])
{
val[t+1][to]=cost+a[t+1]+val[t][v];
p.v=to;
p.val=val[t+1][to];
p.day=t+1;
q.push(p);
}
}
}
if(ans==inf)
return -1;
else
return ans;
}
int main()
{
int m;
scanf("%d %d %d",&n,&m,&k);
for(int i=0; i<m; i++)
{
int u, v;
scanf("%d%d%d",&u,&v,&w.cost);
w.to=v;
g[u].push_back(w);
w.to=u;
g[v].push_back(w);
}
for(int i=1; i<=k; i++)
{
scanf("%d",&a[i]);
}
cout << dij() << endl;
return 0;
}
京公网安备 11010502036488号