bzoj1001
平面图求最小割;
其实看bzoj1001一开始着实把我怔住了
AC的人暴多,可自己完全没思路
后来看了某大牛的ppt,才会做
一个月前做这题的吧,今天来简单回忆一下;
首先是欧拉公式
如果一个连通的平面图有n个点,m条边和f个面,那么f=m-n+2
我们把原图的每个面看成新图的一个点,对于原图中的每条边
如果边只属于一个面,那么给对应点连一个自环;
如果边两侧各有一个面,那么给对应点之间连一条无向边
这样,新图与原图的边一一对应;
可以发现,新图的一条路径对应原图的一个割
于是我们原图起点终点连一条边,增加一个附加面(也可以理解为把外面言直线st分为两个面);
按上述方法建新图,于是最小割问题转化为对新图求最短路;
最短路可以用堆优化dij;
这题我的dij+heap写的有进步
const inf=;
type link=^node;
node=record
po,len:longint;
next:link;
end;
point=record
num,loc:longint;
end; var w:array[..] of link;
heap:array[..] of point;
where,d:array[..] of longint;
xie,hen,shu:array[..,..] of longint;
t,s,i,j,n,m,x,y:longint;
p:link; procedure swap(var a,b:point);
var c:point;
begin
c:=a;
a:=b;
b:=c;
end; procedure add(x,y,z:longint);
var p:link;
begin
new(p);
p^.po:=y;
p^.len:=z;
p^.next:=w[x];
w[x]:=p;
end; procedure up(i:longint);
var j,x,y:longint;
begin
j:=i shr ;
while j> do
begin
if heap[i].num<heap[j].num then
begin
x:=heap[i].loc;
y:=heap[j].loc;
where[x]:=j;
where[y]:=i;
swap(heap[i],heap[j]);
i:=j;
j:=i shr ;
end
else break;
end;
end; procedure sift(i:longint);
var j,x,y:longint;
begin
j:=i shl ;
while j<=s do
begin
if (j+<=s) and (heap[j].num>heap[j+].num) then inc(j);
if heap[i].num>heap[j].num then
begin
x:=heap[i].loc;
y:=heap[j].loc;
where[x]:=j;
where[y]:=i;
swap(heap[i],heap[j]);
i:=j;
j:=i shl ;
end
else break;
end;
end; procedure build; //复杂的建图,这种东西一定要谨慎,错误才会少;
var i:longint;
begin
for i:= to m- do
begin
add(,i+,hen[,i]);
add(i+,,hen[,i]);
end;
for i:= to n- do
begin
x:=(m-)*(*i-)+;
add(,x,shu[i,m]);
add(x,,shu[i,m]);
end; for i:= to m- do
begin
x:=t-m+i;
add(t,x,hen[n,i]);
add(x,t,hen[n,i]);
end;
for i:= to n- do
begin
x:=(m-)*(*i-)+;
add(t,x,shu[i,]);
add(x,t,shu[i,]);
end; for i:= to n- do
for j:= to m- do
begin
x:=(*i-)*(m-)+j+;
y:=x+m-;
add(x,y,hen[i,j]);
add(y,x,hen[i,j]);
end; for i:= to n- do
for j:= to m- do
begin
x:=(*i-)*(m-)+j;
y:=x+m;
add(x,y,shu[i,j]);
add(y,x,shu[i,j]);
end; for i:= to n- do
for j:= to m- do
begin
x:=(*i-)*(m-)+j+;
y:=x+m-;
add(x,y,xie[i,j]);
add(y,x,xie[i,j]);
end;
end; procedure dij; //最短路
var p:link;
mid,k,y:longint;
begin
p:=w[];
for i:= to t do
d[i]:=inf;
d[]:=;
while p<>nil do
begin
x:=p^.po;
d[x]:=min(d[x],p^.len);
p:=p^.next;
end;
s:=;
for i:= to t do
begin
inc(s);
heap[s].num:=d[i];
heap[s].loc:=i; //表示堆的这个位置是哪个点
where[i]:=s; //where表示这个点在堆的哪个位置
up(s);
end; for k:= to t do
begin
mid:=heap[].num;
if s= then break;
if mid=inf then break;
x:=heap[].loc;
y:=heap[s].loc;
where[y]:=; swap(heap[],heap[s]); //退堆
dec(s); sift();
p:=w[x];
while p<>nil do
begin
y:=p^.po;
if d[y]>p^.len+mid then //更新,入堆
begin
d[y]:=p^.len+mid;
heap[where[y]].num:=d[y];
up(where[y]);
end;
p:=p^.next;
end;
end;
end; begin
readln(n,m);
for i:= to n do
begin
for j:= to m- do
read(hen[i,j]);
end;
for i:= to n- do
begin
for j:= to m do
read(shu[i,j]);
end;
for i:= to n- do
begin
for j:= to m- do
read(xie[i,j]);
end; if n= then //注意这种情况要特判
begin
t:=inf;
for i:= to m- do
t:=min(hen[,i],t);
writeln(t);
halt;
end
else if m= then
begin
t:=inf;
for i:= to n- do
t:=min(t,shu[i,]);
writeln(t);
halt;
end;
t:=(n-)*(m-)*+; //计算新图总点数
build;
dij;
writeln(d[t]);
end.
bzoj1001的更多相关文章
- 【bzoj1001】 BeiJing2006—狼抓兔子
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 (题目链接) 题意 给出一张图,求最小割. Solution1 最小割=最大流,所以直接Din ...
- 【BZOJ1001】狼抓兔子(网络流)
[BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...
- BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路
原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html 题目传送门 - BZOJ1001 题意 长成上面那样的网格图求最小割. $n,m\leq ...
- bzoj1001狼抓兔子 对偶图优化
bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
- 【BZOJ1001】[BeiJing2006]狼抓兔子 对偶图最短路
[BZOJ1001][BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子 ...
- 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)
[BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解
[BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 18872 Solved ...
随机推荐
- 九度OJ做题记录 更新.....
2015年1月7日 20:34:23 题目1007:奥运排序问题 有点意思,以后想另外方法快速做出来 2015年1月7日 21:03:56 有一个技巧就是,写了三个比较函数cmp1,cmp2,cmp ...
- C#向C++编写的DLL传递字符串参数的办法
使用StringBuilder,举例: C++代码中函数定义如下: PVPOWERFORCASTDLL_API int PVPowerForcast(SForcastInfo &_Forcas ...
- Oracle数据库间的数据复制 - SQLPlus中的COPY命令
Copy命令可以实现不同Oracle数据库间的数据的复制,也是可以实现同一数据库的数据复制,其性能表现和导入/导出相同. 根据9i文档,说Copy命令未来会不支持,但实际上Oracle 11g仍然支持 ...
- Kinetic使用注意点--collection
new Collection() 扩展了数组,主要用于配合new Container().get()使用 方法: each(func):遍历数组,执行回调函数.回调函数接收两个值,节点和索引. toA ...
- IOS 学习教程
IOS 学习教程http://www.gaixue.com/course/236#### 讲课http://wenku.baidu.com/view/6786064fe518964bcf847c63. ...
- easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined
easyui使用时出现这个Uncaught TypeError: Cannot read property 'nodeName' of undefined 最后检查发现是必须给select一个id,光 ...
- IOS, xib和storyboard的混用--参考
1. 从xib的viewcontroll中启动storyboard 或者 从一个storyboard切换到另一个storyboard: [objc]– (IBAction)openStoryboard ...
- ASP.NET MVC 数据分页思想及解决方案代码
作为一个程序猿,数据分页是每个人都会遇到的问题.解决方案更是琳琅满目,花样百出.但基本的思想都是差不多的. 下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MV ...
- 云风的BLOG❳可靠 UDP 传输
http://mp.weixin.qq.com/s?__biz=MzA3NjYxOTA0MQ==&mid=405432715&idx=1&sn=2e40ceafd4b298e1 ...
- saltstack远程操作WINDOWS的POWERSHELL脚本
这个东东,花了两天来查找资料和测试,终于算是搞定.作记录: 直接在MASTER上执行的命令: salt '*' cmd.script salt://scripts/windows_task.ps1 a ...