记录编号 584241 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2006] 物流运输 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2023-11-03 21:31:54 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n,u,k,m,d;
long long f[N];
int s[N][N],v[N];
struct node{
    int x,l,r;
}a[N];
struct made{
    int ver,nx,ed;
}e[N<<2];
int hd[N],tot;
void add(int x,int y,int z){
    tot++;
    e[tot].ver = y,e[tot].nx = hd[x],e[tot].ed = z,hd[x] = tot;
}
int di[N],v1[N];
void spfa(){
    queue<int>q;
    memset(di,0x3f,sizeof(di));
    memset(v1,0,sizeof(v1));
    q.push(1);v1[1] = 1;di[1] = 0;
    while(!q.empty()){
        int x = q.front();q.pop();
        v1[x] = 0;
        for(int i = hd[x];i;i = e[i].nx){
            int y = e[i].ver,z = e[i].ed;
            if(v[y])continue;
            if(di[x] + z < di[y]){
                di[y] = di[x] + z;
                if(!v1[y])v1[y] = 1,q.push(y);
            }
        }
    }
}
int main(){
    freopen("bzoj_1003.in","r",stdin);
    freopen("bzoj_1003.out","w",stdout);
    scanf("%d%d%d%d",&u,&n,&k,&m);
    for(int i = 1;i <= m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    scanf("%d",&d);
    for(int i = 1;i <= d;i++)scanf("%d%d%d",&a[i].x,&a[i].l,&a[i].r);
    for(int i = 1;i <= u;i++){
        for(int j = i;j <= u;j++){
            memset(v,0,sizeof(v));
            for(int k = 1;k <= d;k++)
                if(i <= a[k].r && j >= a[k].l)v[a[k].x] = 1;
            spfa();
            s[i][j] = di[n];
        }
    }
    memset(f,0x7f,sizeof(f));
    for(int i = 1;i <= u;i++){
        f[i] = 1ll * s[1][i] * i;
        for(int j = 1;j < i;j++)f[i] = min(f[i],f[j] + 1ll * s[j+1][i] * (i-j) + k);
        //dp方程 加ll!!! 
    }
    printf("%lld\n",f[u]);
    
    return 0;
    
}