Shortest way +DP.
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#defineMaxd 150#defineMAXV 250#defineMaxe 50050#defineINF 1000000007using namespacestd;structedge{Long LongV,W,NXT;} E[maxe];Long LongD,n,k,m,qq,g[maxv],nume=0, Dis[maxv],dp[maxv],x,y,z,t[maxd][maxd];BOOLLim[maxd][maxv],vis[maxv],block[maxv];queue<Long Long>Q;voidAddedge (Long LongULong LongVLong LongW) {e[++nume].v=W; E[NUME].W=W; E[NUME].NXT=G[u]; G[u]=Nume;}voidResetLong LongXLong Longy) {memset (block,true,sizeof(block)); Fill (Dis+1, dis+n+1, INF); memset (Vis,false,sizeof(VIS)); while(!q.empty ()) Q.pop (); for(Long Longi=x;i<=y;i++) for(Long Longj=1; j<=n;j++) { if(!Lim[i][j]) block[j]=false; }}Long LongSPFA (Long LongXLong Longy) {Reset (x, y); Q.push (1);d is[1]=0; vis[1]=true; while(!Q.empty ()) { Long LongHead=Q.front (); Q.pop (); for(Long LongI=g[head];i;i=e[i].nxt) { Long Longv=e[i].v; if((Block[v]) && (dis[v]>dis[head]+E[I].W)) {Dis[v]=dis[head]+E[I].W; if(!Vis[v]) {Vis[v]=true; Q.push (v); }}} Vis[head]=false; } returndis[n];}voidDPP () { for(Long LongI=1; i<=d;i++) {Dp[i]=t[1][i]*i; for(Long Longj=0; j<i;j++) Dp[i]=min (dp[i],dp[j]+k+ (i-j) *t[j+1][i]); }}intMain () {memset (g,0,sizeof(g)); Memset (Lim,true,sizeof(Lim)); scanf ("%lld%lld%lld%lld",&d,&n,&k,&m); for(Long LongI=1; i<=m;i++) {scanf ("%lld%lld%lld",&x,&y,&z); Addedge (x, y, z); Addedge (Y,X,Z); } scanf ("%lld",&QQ); for(Long LongI=1; i<=qq;i++) {scanf ("%lld%lld%lld",&x,&y,&z); for(Long Longj=y;j<=z;j++) Lim[j][x]=false; } for(Long LongI=1; i<=d;i++) for(Long Longj=i;j<=d;j++) T[i][j]=SPFA (I,J); DPP (); printf ("%lld\n", Dp[d]); return 0;}
Bzoj 1003 Logistics and transportation