题意:有一张平面图,求它的最小割。N,M.表示网格的大小,N,M均小于等于1000.

左上角点为(1,1),右下角点为(N,M).有以下三种类型的道路 
1:(x,y)<==>(x+1,y) 
2:(x,y)<==>(x,y+1) 
3:(x,y)<==>(x+1,y+1) 
 
思路:第一眼看就是一个最小割=最大流,但点数1000000,边数6000000过大
所以要平面图最小割转最短路 详情见周驿东《浅析最大最小定理在信息学竞赛中的应用》
n=1和m=1要特判,链状的我也母鸡为什么会错,特判就对了
 var q:array[..]of longint;
dis,head:array[..]of longint;
inq:array[..]of boolean;
vet,next,len:array[..]of longint;
num:array[..,..,..]of longint;
n,m,i,j,x,tot,st,ed,s,ans:longint; procedure add(a,b,c:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure spfa;
var t,w,e,v,u:longint;
begin
fillchar(dis,sizeof(dis),$1f);
fillchar(inq,sizeof(inq),false);
t:=-; w:=; q[]:=st; dis[st]:=; inq[st]:=true;
while t<w do
begin
inc(t); u:=q[t mod (ed+)];
inq[u]:=false;
e:=head[u];
while e<> do
begin
v:=vet[e];
if dis[u]+len[e]<dis[v] then
begin
dis[v]:=dis[u]+len[e];
if not inq[v] then
begin
inc(w); q[w mod (ed+)]:=v;
inq[v]:=true;
end;
end;
e:=next[e];
end;
end;
writeln(dis[ed]);
end; begin
//assign(input,'bzoj1001.in'); reset(input);
//assign(output,'bzoj1001.out'); rewrite(output);
readln(n,m);
if (n=)and(m=) then
begin
writeln();
exit;
end;
if n= then
begin
ans:=maxlongint;
for i:= to m- do begin read(x); ans:=min(ans,x); end;
writeln(ans);
exit;
end;
if m= then
begin
ans:=maxlongint;
for j:= to n- do begin read(x); ans:=min(ans,x); end;
writeln(ans);
exit;
end; for i:= to n do
for j:= to m do
begin
inc(s); num[i,j,]:=s;
inc(s); num[i,j,]:=s;
end;
inc(s);
st:=s; ed:=s+;
for i:= to n do
for j:= to m- do
begin
read(x);
if i= then
begin
add(st,num[i,j,],x);
add(num[i,j,],st,x);
end
else if i=n then
begin
add(ed,num[i-,j,],x);
add(num[i-,j,],ed,x);
end
else
begin
add(num[i-,j,],num[i,j,],x);
add(num[i,j,],num[i-,j,],x);
end;
end;
for i:= to n- do
for j:= to m do
begin
read(x);
if j= then
begin
add(num[i,j,],ed,x);
add(ed,num[i,j,],x);
end
else if j=m then
begin
add(num[i,j-,],st,x);
add(st,num[i,j-,],x);
end
else
begin
add(num[i,j-,],num[i,j,],x);
add(num[i,j,],num[i,j-,],x);
end;
end;
for i:= to n- do
for j:= to m- do
begin
read(x);
add(num[i,j,],num[i,j,],x);
add(num[i,j,],num[i,j,],x);
end;
spfa;
// close(input);
//close(output);
end.

UPD(2018.10.17):C++

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 2100000
#define M 6100000
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 int num[][][],q[N],dis[N],head[N],inq[N],
vet[M],nxt[M],len[M],tot,s,st,ed; int add(int a,int b,int c)
{
nxt[++tot]=head[a];
vet[tot]=b;
len[tot]=c;
head[a]=tot;
} void spfa(int st,int ed)
{
memset(dis,0x3f,sizeof(dis));
memset(inq,,sizeof(inq));
int t=; int w=; q[]=st; dis[st]=; inq[st]=;
while(t<w)
{
t++; int u=q[t%(s+)];
inq[u]=;
int e=head[u];
while(e)
{
int v=vet[e];
if(dis[u]+len[e]<dis[v])
{
dis[v]=dis[u]+len[e];
if(!inq[v])
{
w++; q[w%(s+)]=v;
inq[v]=;
}
}
e=nxt[e];
}
}
printf("%d\n",dis[ed]);
} int main()
{
//freopen("bzoj1001.in","r",stdin);
//freopen("bzoj1001.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
if(n==&&m==){printf("0\n"); return ;}
if(n==)
{
int ans=oo;
for(int i=;i<m;i++)
{
int x;
scanf("%d",&x);
ans=min(ans,x);
}
printf("%d\n",ans);
return ;
}
if(m==)
{
int ans=oo;
for(int i=;i<n;i++)
{
int x;
scanf("%d",&x);
ans=min(ans,x);
}
printf("%d\n",ans);
return ;
}
s=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=;k++) num[i][j][k]=++s;
int st=++s;
int ed=++s;
for(int i=;i<=n;i++)
for(int j=;j<=m-;j++)
{
int x;
scanf("%d",&x);
if(i==)
{
add(st,num[i][j][],x);
add(num[i][j][],st,x);
}
else if(i==n)
{
add(ed,num[i-][j][],x);
add(num[i-][j][],ed,x);
}
else
{
add(num[i-][j][],num[i][j][],x);
add(num[i][j][],num[i-][j][],x);
}
} //横边
for(int i=;i<=n-;i++)
for(int j=;j<=m;j++)
{
int x;
scanf("%d",&x);
if(j==)
{
add(num[i][j][],ed,x);
add(ed,num[i][j][],x);
}
else if(j==m)
{
add(num[i][j-][],st,x);
add(st,num[i][j-][],x);
}
else
{
add(num[i][j-][],num[i][j][],x);
add(num[i][j][],num[i][j-][],x);
}
} //纵边 for(int i=;i<=n-;i++)
for(int j=;j<=m-;j++)
{
int x;
scanf("%d",&x);
add(num[i][j][],num[i][j][],x);
add(num[i][j][],num[i][j][],x);
} //斜边
spfa(st,ed);
return ;
}

【BZOJ1001】狼抓兔子(平面图最小割转最短路)的更多相关文章

  1. BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路

    问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...

  2. [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 31805  Solved: 8494[Submit][ ...

  3. BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...

  4. BZOJ1001:狼抓兔子(最小割最大流+vector模板)

    1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...

  5. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  6. bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

    平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~ /*** ...

  7. 2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割)

    2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割) https://www.luogu.com.cn/problem/P4001 题意: 把图分成两部分需要的最 ...

  8. BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)

    显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...

  9. BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图

    BZOJ_2001_[BeiJing2006]狼抓兔子 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 分析:思路同NOI2010海拔. ...

  10. BZOJ1001 狼抓兔子 平面图转对偶图 最小割

    现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...

随机推荐

  1. javaweb基础(9)_Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  2. 使用HTML5语义标签时要注意的问题

    header,nav,section,article,aside,figue,figcaption,footer以上这些标签(除figcaption标签外)都是块级标签,为了让这些标签及元素在所有的浏 ...

  3. Python学习笔记5(函数)

    [摘要]本文详细介绍python中的函数,以及与之相关的参数和作用域的概念,并介绍递归的概念以及在程序中的应用. 函数定义 定义函数要用函数定义语句def.如下: def hello(name): r ...

  4. Docker 守护进程的配置和操作 & 远程访问

    守护进程的配置和操作 1.查看守护进程 linux命令: ps -ef | gerp docker sudo status docker 2.开启关闭重启守护进程 sudo service docke ...

  5. CentOS 7.4 基于LNMP搭建wordpress

    之前有好多次搭建wordpress的经历,有在Ubuntu系统上,有在CentOS7.2系统上,但都是搭完还是稀里糊涂的,因为好多都是教程上照着敲的.这次好好出个教程,以便以后方便查看. 准备工作:C ...

  6. 示例vue 的keep-alive缓存功能的实现

    本篇文章主要介绍了vue 的keep-alive缓存功能的实现,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Vue 实现组件信息的缓存 当我们 ...

  7. Python json和simplejson的使用

    在Python中,json数据和字符串的转换可以使用json模块或simplejson模块. json从Python2.6开始内置到了Python标准库中,我们不需要安装即可直接使用. simplej ...

  8. 通过cookies信息模拟登陆

    import requests # 这个练习演示的是通过传入cookie信息模拟登陆,这样操作的前提是需要预先在浏览器登陆账户抓包得到cookie字段信息 url = "http://www ...

  9. python-matplotlib-lec0

    直奔主题吧..以下是对matplotlib画图的简单讲解,代码已测试. win7 + pycharm + python 2.7 参考文档: http://old.sebug.net/paper/boo ...

  10. Ubuntu下安装anaconda和pycharm

    折腾了一上午,终于装好了,如下:Python环境的安装: 安装anaconda 建议去https://www.anaconda.com/download/#linux直接用Ubuntu界面的搜狐浏览器 ...