#include<cstdio> #include<cstring> #include<queue> using namespace std; queue<int> q; struct E { int y,next,v; }e[800]; int g[110],tmp,dis[21],f[101][101],G[101]; bool v[21][101],un[21],vis[21]; void build(int u,int v,int c) { e[++tmp].y=v;e[tmp].next=g[u];e[tmp].v=c;g[u]=tmp; } int Min(int x,int y) {if (x<y) return x; return y;} void SPFA() { memset(dis,0x3f,sizeof(dis)); q.push(1); dis[1]=0; while(!q.empty()) { int x=q.front();q.pop();vis[x]=false; for (int i=g[x];i;i=e[i].next) if ((!un[e[i].y])&&dis[e[i].y]>dis[x]+e[i].v) { dis[e[i].y]=dis[x]+e[i].v; if (vis[e[i].y]) continue; vis[e[i].y]=true; q.push(e[i].y); } } } int main() { int n,m,K,num,d,a,b,c; scanf("%d%d%d%d",&n,&m,&K,&num); for (int i=1;i<=num;i++) { scanf("%d%d%d",&a,&b,&c); build(a,b,c); build(b,a,c); } scanf("%d",&d); for (int i=1;i<=d;i++) { scanf("%d%d%d",&c,&a,&b); for (int j=a;j<=b;j++) v[c][j]=true; } for (int i=1;i<=n;i++) for (int j=i;j<=n;j++) { memset(un,0,sizeof(un)); for (int k=2;k<m;k++) for (int l=i;l<=j;l++) if (v[k][l]) { un[k]=true; break; } SPFA(); if (dis[m]>=0x3f3f3f3f) f[i][j]=dis[m]; else f[i][j]=dis[m]*(j-i+1); } memset(G,0x3f,sizeof(G)); G[0]=0; for (int i=1;i<=n;i++) for (int j=0;j<i;j++) G[i]=Min(G[i],G[j]+f[j+1][i]+K); printf("%d",G[n]-K); return 0; }
|