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
| const int INF = 0x3f3f3f3f; const int N = 200; const int M = 400; int dis[N],f[N][N],d[N][N],n,m,rr,e,z;
int hd[N],nxt[M],edg[M],to[M],tot; bool vis[N],rea[N][N],now[N];
void add(int u,int v,int w) {to[++tot] = v,edg[tot] = w,nxt[tot] = hd[u],hd[u] = tot;} void addedge(int u,int v,int w) {add(u,v,w),add(v,u,w);}
struct node { int dis,num; friend inline bool operator < (const node & a,const node &b) { return b.dis < a.dis; } };
void dijkstra(int l,int r) { memset(dis,0x3f,sizeof dis); memset(vis,0,sizeof vis); memset(now,0,sizeof now); priority_queue <node> q; for (int i = l;i <= r;++i) { for (int j = 1;j <= m;++j) { if (rea[i][j]) now[j] = 1; } } dis[1] = 0; q.push((node){0,1}); while (!q.empty()) { node p = q.top();q.pop(); int x = p.num; vis[x] = 1; for (int i = hd[x];i;i = nxt[i]) { int y = to[i]; if (!vis[y] && !now[y]) { if (dis[y] > dis[x] + edg[i]) { dis[y] = dis[x] + edg[i]; q.push((node){dis[y],y}); } } } } if (dis[m] != INF) f[l][r] = dis[m] * (r - l + 1); else f[l][r] = INF; }
void input() { read(n,m,rr,e); for (int i = 1;i <= e;++i) { int u,v,w;read(u,v,w); addedge(u,v,w); } read(z); for (int i = 1;i <= z;++i) { int p,a,b;read(p,a,b); for (int j = a;j <= b;++j) { rea[j][p] = 1; } } }
void DP() { for (int len = 2;len <= n;++len) { for (int i = 1;i + len - 1 <= n;++i) { int j = i + len - 1; for (int k = i;k <= j;++k) { f[i][j] = min(f[i][j],f[i][k] + f[k+1][j] + rr); } } } }
signed main() { input(); for (int i = 1;i <= n;++i) { for (int j = i;j <= n;++j) { dijkstra(i,j); } } DP(); printf("%d",f[1][n]); return 0; }
|