1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| // Problem: P1772 [ZJOI2006]物流运输 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P1772 // Memory Limit: 125 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h> using namespace std; #define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;} //#define M //#define mo #define N 300 struct node { int k, x, y, z, n; }d[N*2], a[N]; int n, m, i, j, k; int h[N], dp[N], f[N][N]; int p[N], c[N], ans[N]; int u, v, w, K, dy, g; queue<int> q;
void cun(int x, int y, int z) { d[++k].x=x; d[k].y=y; d[k].z=z; d[k].n=h[x]; h[x]=k; }
int spfa(int s, int t) { while(!q.empty()) q.pop(); memset(ans , 0x3f, sizeof(ans)); memset(p, 0, sizeof(p)); memset(c, 0, sizeof(c)); // for(int i=1; i<=n; ++i) ans[i]=1000000000; for(int i=1; i<=m; ++i) { if(a[i].y<s) continue; if(a[i].x>t) continue; p[a[i].k]=1; } // for(int i=1; i<=n; ++i) printf("%lld ", p[i]); q.push(1); c[1]=1; ans[1]=0; while(!q.empty()) { u=q.front(); q.pop(); c[u]=0; // printf("%lld ", u); for(g=h[u]; g; g=d[g].n) { v=d[g].y; w=d[g].z; if(p[v]) continue; if(ans[u]+w<ans[v]) { ans[v]=ans[u]+w; if(!c[v]) q.push(v), c[v]=1; } } } // printf("%lld\n", ans[n]); return ans[n]; }
signed main() { // freopen("tiaoshi.in", "r", stdin); // freopen("tiaoshi.out", "w", stdout); dy=read(); n=read(); K=read(); m=read(); for(i=1; i<=m; ++i) { u=read(); v=read(); w=read(); cun(u, v, w); cun(v, u, w); } m=read(); for(i=1; i<=m; ++i) { a[i].k=read(); a[i].x=read(); a[i].y=read(); } for(i=1; i<=dy; ++i) for(j=i; j<=dy; ++j) f[i][j]=spfa(i, j); memset(dp, 0x7f, sizeof(dp)); for(i=1; i<=dy; ++i) { dp[i]= (f[1][i]==0x3f3f3f3f3f3f3f3f) ? 0x3f3f3f3f3f3f3f3f : f[1][i]*i; // dp[i]=f[1][i]*i; for(j=0; j<i; ++j) if(f[j+1][i]!=0x3f3f3f3f3f3f3f3f) dp[i]=min(dp[i], dp[j]+f[j+1][i]*(i-(j+1)+1)+K); // printf("dp[%lld]=%lld\n", i, dp[i]); } printf("%lld", dp[dy]); return 0; }
|