码:最短路后 dp
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3fll
using namespace std;
int d,n,m,k,u,v,w,dis[21],c,p,a,b,f[101][101],g[101][101];
bool bc[101][21],cu[21],vis[21];
vector<pair<int,int>>e[21];
priority_queue<pair<int,int>>q;
inline void dij(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1] = 0;
q.push({0,1});
while(q.size()){
int u = q.top().second;
q.pop();
if(vis[u])continue;
vis[u] = true;
for(auto x : e[u]){
int v = x.first,w = x.second;
if(!cu[v]){
continue;
}
if(dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
q.push({-dis[v],v});
}
}
}
return;
}
signed main(){
scanf("%lld%lld%lld%lld",&d,&n,&k,&m);
for(int i = 1;i <= m;i ++){
scanf("%lld%lld%lld",&u,&v,&w);
e[u].push_back({v,w}),e[v].push_back({u,w});
}
scanf("%lld",&c);
for(int i = 1;i <= c;i ++){
scanf("%lld%lld%lld",&p,&a,&b);
for(int j = a;j <= b;j ++){
bc[j][i] = true;
}
}
for(int i = 1;i <= d;i ++){
for(int j = 1;j <= n;j ++){
cu[j] = !bc[i][j];
}
for(int j = i;j <= d;j ++){
for(int k = 1;k <= n;k ++){
cu[k] &= !bc[j][k];
}
dij();
f[i][j] = dis[n];
}
}
for(int r = 1;r <= d;r ++){
for(int l = r;l;l --){
if(f[l][r] != inf){
g[l][r] = f[l][r] * (r - l + 1);
}
else{
g[l][r] = inf;
}
for(int i = l + 1;i <= r;i ++){
if(f[l][i - 1] == inf){
continue;
}
g[l][r] = min(g[l][r],f[l][i - 1] * (i - l) + k + g[i][r]);
}
}
}
printf("%lld",g[1][d]);
return 0;
}