• [ZJOI2006]物流运输


    题目描述 Description
    物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是—件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小。
     
    输入输出格式 Input/output
    输入格式:
    第一行是四个整数n(l≤n≤100)、m(l≤m≤20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来一行是一个整数d,后面的d行每行是三个整数P(1<P<m),a,b(1≤a≤b≤n)。表示编号为P的码头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头A到码头B的运输路线。
    输出格式:
    包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。
     
    输入输出样例 Sample input/output
    样例测试点#1
    输入样例:

    5 5 10 8
    1 2 1
    1 3 3
    1 4 2
    2 3 2
    2 4 4
    3 4 1
    3 5 2
    4 5 2
    4
    2 2 3
    3 1 1
    3 3 3
    4 4 5

    输出样例:
    32
     
     说明 description
    【样例输入说明】

       上图依次表示第1至第5天的情况,阴影表示不可用的码头。
    【样例输出说明】
      前三天走1-4-5,后两天走1-3-5,这样总成本为(2+2)*3+(3+2)*2+10=32。
    _NOI导刊2010提高(01)

    单源最短路+DP
    cop[i]=true 为第i天可连续使用 
    dist[i,j]为从第i天到第j天的可持续的最短路
    f[i,j]:=min{dist[1,i]*i,f[j]+dist[j+1,i]*(i-j)+k}


    {丧病题,毁一生}
    code:
    var a:array[1..20,1..20]of int64;  
        b,c,d,n,m,e,s:int64;  
        i,j,k,u,t:longint;  
        can:array[1..20,1..100]of boolean;  
        dis:array[1..100,1..100]of int64;  
        cop:array[1..20]of boolean;  
        f:array[1..100]of int64;  
      
    function min(a,b:longint):longint;begin if a<b then exit(a)else exit(b)end;  
      
    function getmin(s1,s2:longint):longint;  
    var i,j,k,num,s:longint;  
        f:array[1..20]of longint;  
        bo:array[1..20]of boolean;  
    begin  
      for i:=1 to m do f[i]:=7000000;  
      fillchar(bo,sizeof(bo),false);  
      bo[s1]:=false;f[s1]:=0;  
      while bo[s2]=false do  
      begin  
        num:=maxlongint;  
        for i:=1 to m do  
          if (bo[i]=false)and(cop[i]=true)and(f[i]<num) then  
          begin num:=f[i];s:=i;end;  
        bo[s]:=true;  
        for i:=1 to m do if (f[s]+a[s,i]<f[i])and(cop[i]) then f[i]:=f[s]+a[s,i];  
      end;  
      exit(f[s2]);  
    end;  
      
    begin  
      read(n,m,k,e);  
      for i:=1 to 20 do for j:=1 to 20 do a[i,j]:=7000000;  
      for i:=1 to 20 do a[i,i]:=0;  
      for i:=1 to e do  
      begin  
        read(c,d,s);  
        a[c,d]:=s;  
        a[d,c]:=s;  
      end;  
      read(s);  
      fillchar(can,sizeof(can),true);  
      for i:=1 to s do  
      begin  
        read(t,c,d);  
        for j:=c to d do can[t,j]:=false;  
      end;  
      
      for i:=1 to n do  
         for j:=i to n do  
            begin  
              fillchar(cop,sizeof(cop),true);  
              for u:=1 to m do for t:=i to j do cop[u]:=cop[u] and can[u,t];  
              dis[i,j]:=getmin(1,m);  
            end;  
      
      for i:=1 to n do  
      begin  
        f[i]:=dis[1,i]*i;  
        for j:=1 to i-1 do f[i]:=min(f[i],f[j]+dis[j+1,i]*(i-j)+k);  
      end;  
      
      writeln(f[n]);  
    end. 
  • 相关阅读:
    [stm32] Systick
    [stm32] GPIO及最小框架
    51单片机-PC数据传输 温度 距离 监控系统设计
    [游戏学习29] Win32 图像处理1
    [51单片机] 串口通讯 简单通信
    [汇编] 闰年计算
    Java常用工具类之ArrayUtil
    常用工具类系列之DateUtil
    SpringBoot 获取当前登录用户IP
    Spring data jpa Specification查询关于日期的范围搜索
  • 原文地址:https://www.cnblogs.com/spiderKK/p/4886497.html
Copyright © 2020-2023  润新知