• ZJOI2006物流运输


    唉,没想出来……

    注意到预处理的作用。还有CLJ大牛说的话:这么小的数据,想干什么都可以。

    SPFA预处理+DP 够经典

    var
        f:array[0..100,0..100]of longint;
        a:array[0..20,0..100]of boolean;
        head,next,go,w,q:array[0..10000]of longint;
        dis:array[0..20]of longint;
        v,can:array[0..20]of boolean;
        n,m,k,e,tot,l,r,h,t:longint;
    
    function min(x,y:longint):longint;
    begin
        if x<y then exit(x);
        exit(y);
    end;
    
    procedure spfa;
    var
        i,j,x:longint;
    begin
        h:=0;
        t:=1;
        q[1]:=1;
        for i:=2 to m do
          dis[i]:=21470000;
        dis[1]:=0;
        for i:=2 to m do
          v[m]:=false;
        v[1]:=true;
        for i:=1 to m do
          begin
            can[i]:=true;
            for j:=l to r do
              if a[i,j] then can[i]:=false;
          end;
        while h<=t do
          begin
            inc(h);
            x:=q[h];
            v[x]:=false;
            i:=head[x];
            while i<>0 do
              begin
                j:=go[i];
                if can[j] then
                if dis[j]>dis[x]+w[i] then
                begin
                  dis[j]:=dis[x]+w[i];
                  if v[x]=false then
                  begin
                    inc(t);
                    v[j]:=true;
                    q[t]:=j;
                  end;
                end;
                i:=next[i];
              end;
          end;
        f[l,r]:=dis[m]*(r-l+1);
    end;
    
    procedure insert(x,y,z:longint);
    begin
        inc(tot);
        go[tot]:=y;
        next[tot]:=head[x];
        head[x]:=tot;
        w[tot]:=z;
    end;
    
    procedure init;
    var
        i,j,x,y,z:longint;
    begin
        read(n,m,k,e);
        for i:=1 to e do
          begin
            read(x,y,z);
            insert(x,y,z);
            insert(y,x,z);
          end;
        read(e);
        fillchar(a,sizeof(a),false);
        for i:=1 to e do
          begin
            read(x,y,z);
            for j:=y to z do
              a[x,j]:=true;
          end;
        for l:=1 to n do
          for r:=l to n do
            spfa;
    end;
    procedure dp;
    var
        i,j,l:longint;
    begin
        for i:=1 to n-1 do
          for j:=1 to n-i do
            for l:=j to i+j-1 do
              f[j,i+j]:=min(f[j,i+j],f[j,l]+k+f[l+1,i+j]);
        write(f[1,n]);
    end;
    
    begin
        init;
        dp;
    end.       
  • 相关阅读:
    Final发布
    Final发布 视频展示
    Final发布 文案+美工展示
    PSP总结报告
    作业 20181204-1 每周例行报告
    对团队成员公开感谢
    作业 20181127-1 附加作业 软件工程原则的应用实例分析
    作业 20181127-2 每周例行报告
    作业 20181120-1 每周例行报告
    作业 20181113-2 每周例行报告
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3763213.html
Copyright © 2020-2023  润新知