记录编号 437485 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2006] 物流运输 最终得分 100
用户昵称 GravatarHzoi_moyi 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2017-08-14 10:46:44 内存使用 0.60 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int f[105],n,m,k,e,h[25],e1,a1,a2,a3;
int d,di[25],date[25][105],dis[105][105];
bool r[25];
queue<int> q;
struct B
{
    int ne,v,w;
}b[20000];
void add(int x,int y,int z)
{
    b[e1].v=y;
    b[e1].w=z;
    b[e1].ne=h[x];
    h[x]=e1++;
}
void spfa(int l,int ri)
{
     for(int i=1;i<=m;i++) di[i]=10000000;
     q.push(1);
     di[1]=0;
     r[1]=1;
     while(!q.empty())
     {
        a2=q.front();
        r[a2]=0;
        q.pop();
        for(int i=h[a2];i!=-1;i=b[i].ne)
          if(date[b[i].v][ri]-date[b[i].v][l-1]==0&&di[b[i].v]>di[a2]+b[i].w)
          {
             di[b[i].v]=di[a2]+b[i].w;
             if(!r[b[i].v])
             {
                 r[b[i].v]=1;
                 q.push(b[i].v);
             }
          }
     }
     dis[l][ri]=di[m];
}
inline void bj(int &x,int y)
{
     x=x<y?x:y;
}
int main()
{
    //freopen("t.txt","r",stdin);
    freopen("bzoj_1003.in","r",stdin);
    freopen("bzoj_1003.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&k,&e);
    memset(h,-1,sizeof(h));
    for(int i=1;i<=e;i++)
    {
       scanf("%d%d%d",&a1,&a2,&a3);
       add(a1,a2,a3);
       add(a2,a1,a3);
    }
    scanf("%d",&d);
    for(int i=1;i<=d;i++)
    {
       scanf("%d%d%d",&a1,&a2,&a3);
       for(int j=a2;j<=a3;j++)
          date[a1][j]++;
    }
    for(int i=1;i<=m;i++)
      for(int j=1;j<=n;j++)
       date[i][j]+=date[i][j-1];
    for(int i=1;i<=n;i++)
      for(int j=i;j<=n;j++)
        spfa(i,j);
    memset(f,0x3f,sizeof(f));
    f[1]=dis[1][1];
    f[0]=0;
    for(int i=2;i<=n;i++)
    {
      f[i]=(long long)dis[1][i]*i;
      for(int j=1;j<=i;j++)
        bj(f[i],f[j-1]+dis[j][i]*(i-j+1)+k);
    }
    printf("%d",f[n]);  
    //while(1);
    return 0;
}