题意:有一张平面图,求它的最小割。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要特判,链状的我也母鸡为什么会错,特判就对了
  1. var q:array[..]of longint;
  2. dis,head:array[..]of longint;
  3. inq:array[..]of boolean;
  4. vet,next,len:array[..]of longint;
  5. num:array[..,..,..]of longint;
  6. n,m,i,j,x,tot,st,ed,s,ans:longint;
  7.  
  8. procedure add(a,b,c:longint);
  9. begin
  10. inc(tot);
  11. next[tot]:=head[a];
  12. vet[tot]:=b;
  13. len[tot]:=c;
  14. head[a]:=tot;
  15. end;
  16.  
  17. function min(x,y:longint):longint;
  18. begin
  19. if x<y then exit(x);
  20. exit(y);
  21. end;
  22.  
  23. procedure spfa;
  24. var t,w,e,v,u:longint;
  25. begin
  26. fillchar(dis,sizeof(dis),$1f);
  27. fillchar(inq,sizeof(inq),false);
  28. t:=-; w:=; q[]:=st; dis[st]:=; inq[st]:=true;
  29. while t<w do
  30. begin
  31. inc(t); u:=q[t mod (ed+)];
  32. inq[u]:=false;
  33. e:=head[u];
  34. while e<> do
  35. begin
  36. v:=vet[e];
  37. if dis[u]+len[e]<dis[v] then
  38. begin
  39. dis[v]:=dis[u]+len[e];
  40. if not inq[v] then
  41. begin
  42. inc(w); q[w mod (ed+)]:=v;
  43. inq[v]:=true;
  44. end;
  45. end;
  46. e:=next[e];
  47. end;
  48. end;
  49. writeln(dis[ed]);
  50. end;
  51.  
  52. begin
  53. //assign(input,'bzoj1001.in'); reset(input);
  54. //assign(output,'bzoj1001.out'); rewrite(output);
  55. readln(n,m);
  56. if (n=)and(m=) then
  57. begin
  58. writeln();
  59. exit;
  60. end;
  61. if n= then
  62. begin
  63. ans:=maxlongint;
  64. for i:= to m- do begin read(x); ans:=min(ans,x); end;
  65. writeln(ans);
  66. exit;
  67. end;
  68. if m= then
  69. begin
  70. ans:=maxlongint;
  71. for j:= to n- do begin read(x); ans:=min(ans,x); end;
  72. writeln(ans);
  73. exit;
  74. end;
  75.  
  76. for i:= to n do
  77. for j:= to m do
  78. begin
  79. inc(s); num[i,j,]:=s;
  80. inc(s); num[i,j,]:=s;
  81. end;
  82. inc(s);
  83. st:=s; ed:=s+;
  84. for i:= to n do
  85. for j:= to m- do
  86. begin
  87. read(x);
  88. if i= then
  89. begin
  90. add(st,num[i,j,],x);
  91. add(num[i,j,],st,x);
  92. end
  93. else if i=n then
  94. begin
  95. add(ed,num[i-,j,],x);
  96. add(num[i-,j,],ed,x);
  97. end
  98. else
  99. begin
  100. add(num[i-,j,],num[i,j,],x);
  101. add(num[i,j,],num[i-,j,],x);
  102. end;
  103. end;
  104. for i:= to n- do
  105. for j:= to m do
  106. begin
  107. read(x);
  108. if j= then
  109. begin
  110. add(num[i,j,],ed,x);
  111. add(ed,num[i,j,],x);
  112. end
  113. else if j=m then
  114. begin
  115. add(num[i,j-,],st,x);
  116. add(st,num[i,j-,],x);
  117. end
  118. else
  119. begin
  120. add(num[i,j-,],num[i,j,],x);
  121. add(num[i,j,],num[i,j-,],x);
  122. end;
  123. end;
  124. for i:= to n- do
  125. for j:= to m- do
  126. begin
  127. read(x);
  128. add(num[i,j,],num[i,j,],x);
  129. add(num[i,j,],num[i,j,],x);
  130. end;
  131. spfa;
  132. // close(input);
  133. //close(output);
  134. end.

UPD(2018.10.17):C++

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<string>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<vector>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned int uint;
  14. typedef unsigned long long ull;
  15. typedef pair<int,int> PII;
  16. typedef vector<int> VI;
  17. #define fi first
  18. #define se second
  19. #define MP make_pair
  20. #define N 2100000
  21. #define M 6100000
  22. #define eps 1e-8
  23. #define pi acos(-1)
  24. #define oo 1e9
  25.  
  26. int num[][][],q[N],dis[N],head[N],inq[N],
  27. vet[M],nxt[M],len[M],tot,s,st,ed;
  28.  
  29. int add(int a,int b,int c)
  30. {
  31. nxt[++tot]=head[a];
  32. vet[tot]=b;
  33. len[tot]=c;
  34. head[a]=tot;
  35. }
  36.  
  37. void spfa(int st,int ed)
  38. {
  39. memset(dis,0x3f,sizeof(dis));
  40. memset(inq,,sizeof(inq));
  41. int t=; int w=; q[]=st; dis[st]=; inq[st]=;
  42. while(t<w)
  43. {
  44. t++; int u=q[t%(s+)];
  45. inq[u]=;
  46. int e=head[u];
  47. while(e)
  48. {
  49. int v=vet[e];
  50. if(dis[u]+len[e]<dis[v])
  51. {
  52. dis[v]=dis[u]+len[e];
  53. if(!inq[v])
  54. {
  55. w++; q[w%(s+)]=v;
  56. inq[v]=;
  57. }
  58. }
  59. e=nxt[e];
  60. }
  61. }
  62. printf("%d\n",dis[ed]);
  63. }
  64.  
  65. int main()
  66. {
  67. //freopen("bzoj1001.in","r",stdin);
  68. //freopen("bzoj1001.out","w",stdout);
  69. int n,m;
  70. scanf("%d%d",&n,&m);
  71. if(n==&&m==){printf("0\n"); return ;}
  72. if(n==)
  73. {
  74. int ans=oo;
  75. for(int i=;i<m;i++)
  76. {
  77. int x;
  78. scanf("%d",&x);
  79. ans=min(ans,x);
  80. }
  81. printf("%d\n",ans);
  82. return ;
  83. }
  84. if(m==)
  85. {
  86. int ans=oo;
  87. for(int i=;i<n;i++)
  88. {
  89. int x;
  90. scanf("%d",&x);
  91. ans=min(ans,x);
  92. }
  93. printf("%d\n",ans);
  94. return ;
  95. }
  96. s=;
  97. for(int i=;i<=n;i++)
  98. for(int j=;j<=m;j++)
  99. for(int k=;k<=;k++) num[i][j][k]=++s;
  100. int st=++s;
  101. int ed=++s;
  102. for(int i=;i<=n;i++)
  103. for(int j=;j<=m-;j++)
  104. {
  105. int x;
  106. scanf("%d",&x);
  107. if(i==)
  108. {
  109. add(st,num[i][j][],x);
  110. add(num[i][j][],st,x);
  111. }
  112. else if(i==n)
  113. {
  114. add(ed,num[i-][j][],x);
  115. add(num[i-][j][],ed,x);
  116. }
  117. else
  118. {
  119. add(num[i-][j][],num[i][j][],x);
  120. add(num[i][j][],num[i-][j][],x);
  121. }
  122. } //横边
  123. for(int i=;i<=n-;i++)
  124. for(int j=;j<=m;j++)
  125. {
  126. int x;
  127. scanf("%d",&x);
  128. if(j==)
  129. {
  130. add(num[i][j][],ed,x);
  131. add(ed,num[i][j][],x);
  132. }
  133. else if(j==m)
  134. {
  135. add(num[i][j-][],st,x);
  136. add(st,num[i][j-][],x);
  137. }
  138. else
  139. {
  140. add(num[i][j-][],num[i][j][],x);
  141. add(num[i][j][],num[i][j-][],x);
  142. }
  143. } //纵边
  144.  
  145. for(int i=;i<=n-;i++)
  146. for(int j=;j<=m-;j++)
  147. {
  148. int x;
  149. scanf("%d",&x);
  150. add(num[i][j][],num[i][j][],x);
  151. add(num[i][j][],num[i][j][],x);
  152. } //斜边
  153. spfa(st,ed);
  154. return ;
  155. }

【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. python - 辨识alert、window以及操作

    selenium之 辨识alert.window以及操作 原创 2016年08月24日 11:01:04 4820 0 2 更多关于python selenium的文章,请关注我的专栏:Python ...

  2. jdk配置与环境变量配置

    1.1.下载jdk1.8.0,如图所示 解压放在你用的位置 在官网中下载 1.2.配置环境变量 打开环境变量:计算机-->属性-->高级系统配置-->环境变量 配置JAVA_HOME ...

  3. Ajax请求出现406的原因

    一般出现406错误有两种可能: 1.如果后缀是html是不能响应json数据的.需要修改后缀名. 在做伪静态化过程中,以.html结尾的后缀,做post请求时,不能响应json格式,这是spring官 ...

  4. shell 练习题 - 第三周

    1.编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中 #!/bin/bash echo "start backup& ...

  5. 无需上传附件到服务器,Servlet读取Excel(二)

    package com.str; import java.io.File;import java.io.FileInputStream;import java.io.IOException; impo ...

  6. 关于使用Java实现的简单网络爬虫Demo

    什么是网络爬虫? 网络爬虫又叫蜘蛛,网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直 ...

  7. filter 作用

     过滤器 filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能. filter是一个可以复用的代码片段,可以用来转换HTT ...

  8. JAVA、JDK等入门概念,下载安装JAVA并配置环境变量

    一.概念 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言,具体介绍可查阅百度JAVA百科,这里不再赘述. Java分为三个体系,分别为: Java SE(J2SE,Java2 Platf ...

  9. BZOJ 4027: [HEOI2015]兔子与樱花

    贪心 #include<cstdio> #include<algorithm> using namespace std; int cnt,n,m,F[2000005],c[20 ...

  10. LA 4253 Archery 二分

    题意: x轴上方有若干条平行于x轴的线段 在x轴的区间\([0, \, W]\)内找一点发射一条射线,使其穿过所有线段. 问是否存在这样的点. 分析: 我们二分射线端点的坐标,将线段按纵坐标从小到大排 ...