有边数限制的最短路 —— bellman_ford 模板题

时间复杂度 O(nm)

#include <bits/stdc++.h>

using namespace std;

const int N = 1010, M = 20010;

struct node{
    int a,b,w;
}p[M];
int a[N];
int sum[N];
int dist[N];
int backup[N];
int n,m,k;
int t;

int bellman_ford(){
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;

    int ans=1e9;
    for(int i=1;i<=k;i++){
        memcpy(backup,dist,sizeof dist);
        for(int j=0;j<t;j++) {
            int a=p[j].a,b=p[j].b,w=p[j].w;
            if(dist[b]>backup[a]+w){
                dist[b]=backup[a]+w;
                if(b==n) ans=min(ans,dist[n]+sum[i]);    //更新总花费
            }
        }
    }

    if(dist[n]==0x3f3f3f3f) return -1;   //无法到达n点
    return ans;
}

int main(){
    cin>>n>>m>>k;

    while(m--) {
        int a,b,w;
        cin>>a>>b>>w;
        p[t++]={a,b,w};
        p[t++]={b,a,w};
    }
    for(int i=1;i<=k;i++) cin>>a[i],sum[i]=sum[i-1]+a[i];

    int x=bellman_ford();
    cout<<x<<endl;

    return 0;
}