【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 狼抓兔子 平面图转对偶图 最小割
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...
随机推荐
- 【转】 VC中TCP实现 异步套接字编程的原理+代码
所谓的异步套接字编程就是 调用了 如下函数 WSAAsyncSelect 设置了 套接字的状态为异步,有关函数我会在下面详细介绍... 异步套接字解决了 套接字编程过程中的堵塞问题 .... ...
- 【思维题 状压dp】APC001F - XOR Tree
可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...
- [LUOGU] P2634 [国家集训队]聪聪可可
点分治裸题,甚至不需要栈回撤. 尝试用容斥写了一波,就是把所有子树混一块计算,最后减去子树内路径条数. #include<iostream> #include<cstring> ...
- 如何使用jmeter做关联
1.适用场景 从上一个接口的返回值中获取值传递给下一个接口使用 2.添加JSON Extractor 在需求提取的参数上添加--后置处理器--JSON Extractor 从登录接口的返回值中取use ...
- mysql的字符串连接符
以前用SQL Server 连接字符串是用“+”,现在数据库用mysql,写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作 ...
- thinkphp5开发restful-api接口 学习笔记一
视频学习地址: http://study.163.com/course/courseMain.htm?courseId=1004171002 源码和文档(如果满意,欢迎 star): https:// ...
- Ubuntu系统里的python
Ubuntu系统里,默认安装python2.7.x版本的python,直接执行python命令,打开的将是python 2.7.x版本:python3版本的需要自行安装,安装成功后,执行python3 ...
- JAVA基础篇—String和StringBuffer
区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append() ...
- zoj 4054
#define ll long long ; int t; ll ans,tmp; char s[N]; int main() { scanf("%d",&t); whil ...
- csapp-15213错误修正18-10-28
1.p229 练习题3.15 b.答案错误,应为400419