题意:
有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;
}