【BZOJ1001】狼抓兔子(平面图最小割转最短路)
题意:有一张平面图,求它的最小割。N,M.表示网格的大小,N,M均小于等于1000.
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】狼抓兔子(平面图最小割转最短路)的更多相关文章
- BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...
- bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割
平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割 找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化 不过时间还是一般 估计是dij写的不好 大神勿喷~~~ /*** ...
- 2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割)
2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割) https://www.luogu.com.cn/problem/P4001 题意: 把图分成两部分需要的最 ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
- BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图
BZOJ_2001_[BeiJing2006]狼抓兔子 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 分析:思路同NOI2010海拔. ...
- BZOJ1001 狼抓兔子 平面图转对偶图 最小割
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...
随机推荐
- ps基础实例
一:合并多个图片 1.先新件一个图片)CTRL+N),大小定成你想要的大小 2.把你要放入的照片用PS打开 3.把放入的照片用移动工具(V)拉到新件的图片里面 4.用CTRL+T调整大小(按住SHIF ...
- 洛谷 P2717 寒假作业
https://www.luogu.org/problemnew/show/P2717 $n \le 1004枚举区间,挨个计算,判断,时间复杂度$O(n^3)$. $n \le 5000$,预处理出 ...
- Pandas中数据的处理
有两种丢失数据 ——None ——np.nan(NaN) None是python自带的,其类型为python object.因此,None不能参与到任何计算中 Object类型的运算比int类型的运算 ...
- SpringMVC 项目中引用其他 Module 中的方法
1. 将要引用的Module 引入项目中 2. 在主Module中添加依赖, 3. 被引用的类必须放在 Module 中/src/下的某个package中,否则引用不到(重要)
- 常用的windows小工具指令和如何打开自定义的程序
windows可以通过 开始->运行->输入程序名 或 windows键+R键 两种方式来启动windows中自带的程序或手动安装的程序.下面介绍一些常用的windows工具的指令和如何打 ...
- IIS7.0/8.0的错误HTTP Error 500.19 - Internal Server Error ,错误代码为0x80070021
最近在部署项目的时候,总是出现了这个问题. 大概原因为IIS7.0的安全设定相比前版本有很大的变更.IIS7.0的安全设置文件在%windir%\system32\inetsrv \config\ap ...
- virtualbox安装win7系统报错(“FATAL:No bootable medium found!”)
virtualbox属于傻瓜式安装虚拟系统,但博主安装win7系统时,无论怎么调试都还是出现截图所述样式,网上教程很多,但是都不行,其实只有一个根本原因安装的iso镜像不是原生镜像,下载的镜像已经是被 ...
- Python学习笔记:open函数和with临时运行环境(文件操作)
open函数 1.open函数: file=open(filename, encoding='utf-8'),open()函数是Python内置的用于对文件的读写操作,返回的是文件的流对象(而不是文件 ...
- ACM-ICPC 2016 Qingdao Preliminary Contest G. Sort
Recently, Bob has just learnt a naive sorting algorithm: merge sort. Now, Bob receives a task from A ...
- MySQL-状态Waiting on empty queue引申
MySQL 事件调度器示例演示 我们大家都知道MySQL 事件调度器是在 MySQL 5.1 中新生的一个较为特殊的功能,其可以作为定时任务调度器,来取代部分原先只能用操作系统任务调度器才能完成的定时 ...