【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 狼抓兔子 平面图转对偶图 最小割
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...
随机推荐
- python - 辨识alert、window以及操作
selenium之 辨识alert.window以及操作 原创 2016年08月24日 11:01:04 4820 0 2 更多关于python selenium的文章,请关注我的专栏:Python ...
- jdk配置与环境变量配置
1.1.下载jdk1.8.0,如图所示 解压放在你用的位置 在官网中下载 1.2.配置环境变量 打开环境变量:计算机-->属性-->高级系统配置-->环境变量 配置JAVA_HOME ...
- Ajax请求出现406的原因
一般出现406错误有两种可能: 1.如果后缀是html是不能响应json数据的.需要修改后缀名. 在做伪静态化过程中,以.html结尾的后缀,做post请求时,不能响应json格式,这是spring官 ...
- shell 练习题 - 第三周
1.编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中 #!/bin/bash echo "start backup& ...
- 无需上传附件到服务器,Servlet读取Excel(二)
package com.str; import java.io.File;import java.io.FileInputStream;import java.io.IOException; impo ...
- 关于使用Java实现的简单网络爬虫Demo
什么是网络爬虫? 网络爬虫又叫蜘蛛,网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直 ...
- filter 作用
过滤器 filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能. filter是一个可以复用的代码片段,可以用来转换HTT ...
- JAVA、JDK等入门概念,下载安装JAVA并配置环境变量
一.概念 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言,具体介绍可查阅百度JAVA百科,这里不再赘述. Java分为三个体系,分别为: Java SE(J2SE,Java2 Platf ...
- BZOJ 4027: [HEOI2015]兔子与樱花
贪心 #include<cstdio> #include<algorithm> using namespace std; int cnt,n,m,F[2000005],c[20 ...
- LA 4253 Archery 二分
题意: x轴上方有若干条平行于x轴的线段 在x轴的区间\([0, \, W]\)内找一点发射一条射线,使其穿过所有线段. 问是否存在这样的点. 分析: 我们二分射线端点的坐标,将线段按纵坐标从小到大排 ...