1 #include<cstdio> 2 #include<queue> 3 #include<iostream> 4 #include<cstring> 5 #define M 1000 6 using namespace std; 7 int n,m,k,e,cnt,head[M],next[2*M],u[2*M],v[2*M],f[110][110],b[110]; 8 int f1[110]; 9 long long t[110][110],ff[110]; 10 void jia(int a1,int a2,int a3) 11 { 12 cnt++; 13 next[cnt]=head[a1]; 14 u[cnt]=a2; 15 v[cnt]=a3; 16 head[a1]=cnt; 17 return; 18 } 19 int sp(int x,int y) 20 { 21 memset(b,0,sizeof(b)); 22 memset(f1,0,sizeof(f1)); 23 for(int i=x;i<=y;i++) 24 for(int j=1;j<=m;j++) 25 if(f[i][j]) 26 b[j]=1; 27 queue<int>q; 28 q.push(1); 29 f1[1]=1; 30 int d[22]; 31 for(int i=2;i<=m;i++) 32 d[i]=0x7fffffff; 33 d[1]=0; 34 for(;!q.empty();) 35 { 36 int p=q.front(); 37 q.pop(); 38 f1[p]=0; 39 for(int i=head[p];i;i=next[i]) 40 if(!b[u[i]]&&d[u[i]]>d[p]+v[i]) 41 { 42 d[u[i]]=d[p]+v[i]; 43 if(!f1[u[i]]) 44 { 45 q.push(u[i]); 46 f1[u[i]]=1; 47 } 48 } 49 } 50 return(d[m]); 51 } 52 void dp() 53 { 54 for(int i=1;i<=n;i++) 55 { 56 ff[i]=(long long)t[1][i]*i; 57 for(int j=1;j<i;j++) 58 ff[i]=min(ff[i],ff[j]+k+t[j+1][i]*(i-j)); 59 } 60 return; 61 } 62 int main() 63 { 64 scanf("%d%d%d%d",&n,&m,&k,&e); 65 for(int i=1;i<=e;i++) 66 { 67 int a1,a2,a3; 68 scanf("%d%d%d",&a1,&a2,&a3); 69 jia(a1,a2,a3); 70 jia(a2,a1,a3); 71 } 72 int d; 73 scanf("%d",&d); 74 for(int i=1;i<=d;i++) 75 { 76 int x,y,z; 77 scanf("%d%d%d",&x,&y,&z); 78 for(int j=y;j<=z;j++) 79 f[j][x]=1; 80 } 81 for(int i=1;i<=n;i++) 82 for(int j=1;j<=n;j++) 83 { 84 t[i][j]=sp(i,j); 85 // printf("%d\n",t[i][j]); 86 } 87 dp(); 88 printf("%d\n",ff[n]); 89 return 0; 90 }
先用SPFA处理出每一段时间的最短路,然后dp