博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1001 平面图转对偶图 最短路求图最小割
阅读量:6280 次
发布时间:2019-06-22

本文共 3854 字,大约阅读时间需要 12 分钟。

原题传送门

整理了下之前A的题

平面图可以转化成对偶图,然后(NlogN)的可以求出图的最小割(最大流)

算法合集有具体的讲解,有兴趣的可以在网上搜下或者向我要(QQ30056882)

/**************************************************************    Problem: 1001    User: BLADEVIL    Language: Pascal    Result: Accepted    Time:4124 ms    Memory:158960 kb****************************************************************/ //By BLADEVILvar    n, m                    :longint;    pre, other, len, last   :array[0..6001000] of longint;    l                       :longint;    heng, shu, xie          :array[0..2010,0..2010] of longint;    tot                     :longint;    st, fin                 :longint;    que, d                  :array[0..2000010] of longint;    flag                    :array[0..2000010] of boolean;     procedure connect(x,y,z:longint);begin    inc(l);    pre[l]:=last[x];    last[x]:=l;    other[l]:=y;    len[l]:=z;end;     procedure init;var    i, j                    :longint;    min                     :longint;begin    read(n,m);    for i:=1 to n do        for j:=1 to m-1 do read(heng[i,j]);         for i:=1 to n-1 do        for j:=1 to m do read(shu[i,j]);             for i:=1 to n-1 do        for j:=1 to m-1 do read(xie[i,j]);    min:=maxlongint;    if (n=1) or (m=1) then    begin        for i:=1 to n do            for j:=1 to m do            begin                if heng[i,j]>0 then if min>heng[i,j] then min:=heng[i,j];                if shu[i,j]>0 then if min>shu[i,j] then min:=shu[i,j];                if xie[i,j]>0 then if min>xie[i,j] then min:=xie[i,j];            end;        writeln(min);        halt;    end;    tot:=2*(m-1)*(n-1);    for i:=1 to tot do    if i mod 2=0 then    begin        if ((i mod (2*(m-1)))>0) then        begin            connect(i,i+1,shu[i div (2*(m-1))+1,(i mod (2*(m-1))) div 2+1]);            connect(i+1,i,shu[i div (2*(m-1))+1,(i mod (2*(m-1))) div 2+1]);        end;        if (i-2*m+1>0) then            if ((i mod (2*(m-1)))>0) then            begin                connect(i,i-2*m+1,heng[i div (2*(m-1))+1,(i mod (2*(m-1))) div 2]);                 connect(i-2*m+1,i,heng[i div (2*(m-1))+1,(i mod (2*(m-1))) div 2]);            end else            begin                connect(i,i-2*m+1,heng[i div (2*(m-1)),m-1]);                   connect(i-2*m+1,i,heng[i div (2*(m-1)),m-1]);            end;    end else    begin        connect(i,i+1,xie[i div (2*(m-1))+1,((i mod (2*(m-1)))+1) div 2]);        connect(i+1,i,xie[i div (2*(m-1))+1,((i mod (2*(m-1)))+1) div 2]);    end;    st:=tot+1; fin:=tot+2;    for i:=1 to (m-2) do    begin        connect(st,i*2,heng[1,i]);        connect(i*2,st,heng[1,i]);    end;    for i:=2 to (n-1) do    begin        connect(st,i*2*(m-1),shu[i,m]);        connect(i*2*(m-1),st,shu[i,m]);    end;    connect(st,2*(m-1),shu[1,m]);       connect(st,2*(m-1),heng[1,m-1]);        connect(2*(m-1),st,shu[1,m]);    connect(2*(m-1),st,heng[1,m-1]);    for i:=2 to (m-1) do    begin        connect((n-2)*2*(m-1)+2*i-1,fin,heng[n,i]);        connect(fin,(n-2)*2*(m-1)+2*i-1,heng[n,i]);    end;    for i:=1 to (n-2) do    begin        connect(fin,(i-1)*2*(m-1)+1,shu[i,1]);        connect((i-1)*2*(m-1)+1,fin,shu[i,1]);    end;    connect(fin,(n-2)*2*(m-1)+1,shu[(n-1),1]);    connect(fin,(n-2)*2*(m-1)+1,heng[n,1]);    connect((n-2)*2*(m-1)+1,fin,shu[(n-1),1]);    connect((n-2)*2*(m-1)+1,fin,heng[n,1]);end;  procedure main;var    i, j                    :longint;    h, t                    :longint;    cur                     :longint;    q, p                    :longint;     begin    que[1]:=st;     filldword(d,sizeof(d) div 4,maxlongint div 10);    d[st]:=0;    t:=1; h:=0;    while h<>t do    begin        h:=h mod 2000000+1;        cur:=que[h];        flag[cur]:=false;        q:=last[cur];        while q<>0 do        begin            p:=other[q];            if d[cur]+len[q]

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3436390.html

你可能感兴趣的文章
技术人员的焦虑
查看>>
js 判断整数
查看>>
建设网站应该考虑哪些因素
查看>>
mongodb $exists
查看>>
js实现页面跳转的几种方式
查看>>
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>
!important 和 * ----hack
查看>>
聊天界面图文混排
查看>>
控件的拖动
查看>>
svn eclipse unable to load default svn client的解决办法
查看>>
Android.mk 文件语法详解
查看>>
QT liunx 工具下载
查看>>
内核源码树
查看>>
Java 5 特性 Instrumentation 实践
查看>>
AppScan使用
查看>>
Java NIO框架Netty教程(三) 字符串消息收发(转)
查看>>
Ucenter 会员同步登录通讯原理
查看>>
php--------获取当前时间、时间戳
查看>>