(胡扯时间)今天炒鸡无聊就打算BZOJ开始从第一道题开始顺着打,这样未来一段时间内也就有事干了。结果发现A+B切掉后就遭遇了一个"小小"的瓶颈(真不友好。

好了说题说题。看题第一眼我下意识想打个最短路直接跑过,结果发现没有给兔子总共有多少(那就肯定最短不了了。

然后内心***之后发现还不是平面图,那我赶紧先认真起来好好打(恶)个(补)对偶图吧。

此时我又想到了qy巨佬教育我们的"脑补一下这个题,是不是很简单。"

脑补越强,对偶图越简单。

正解time:

显而易见这是一道赤果果的网络流,那就转化为对偶图然后直接跑个堆优化Dij吧。

在我MLE两遍T了一次以后发现还是得用spfa(qwq。

个人感觉最难的其实还是在平面图->对偶图的时候需要脑补每个面的编号进行加边。

我当时一直不太理解两个面连边是穿过的曾经的那个边就为现在这个边的权值应该如何实现。

后来发现完全可以直接建对偶图而不是平面图->对偶图。(orz。

我的加边代码可能和你们的不太一样(编号问题,所以推荐自己脑补一下自己的代码。

死于快读。!!!!!!!

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<cctype>
  8. #include<queue>
  9. #define rg register
  10. using namespace std;
  11. //inline int read(){
  12. // rg int s=0,f=0;
  13. // rg char ch=getchar();
  14. // while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
  15. // while(isdigit(ch)) s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
  16. // return f?-s:s;
  17. //}
  18. int n,m,s,t,cnt;
  19. const int MAX=6000015;
  20. struct edge{
  21. int nxt;
  22. int to;
  23. int val;
  24. }e[MAX];
  25. int dis[MAX],head[MAX];
  26. bool vis[MAX];
  27. queue<int>q;
  28. inline void add(int u,int v,int w){
  29. e[++cnt].nxt=head[u];
  30. e[cnt].to=v;
  31. e[cnt].val=w;
  32. head[u]=cnt;
  33. }
  34. int spfa(){
  35. memset(dis,0x3f,sizeof(dis));
  36. dis[s]=0;
  37. q.push(s);
  38. while(!q.empty()){
  39. int u=q.front();
  40. q.pop();
  41. vis[u]=0;
  42. for(rg int i=head[u];i;i=e[i].nxt){
  43. if(dis[e[i].to]>dis[u]+e[i].val){
  44. dis[e[i].to]=dis[u]+e[i].val;
  45. if(!vis[e[i].to]){
  46. vis[e[i].to]=1;
  47. q.push(e[i].to);
  48. }
  49. }
  50. }
  51. }
  52. return dis[t];
  53. }
  54. int main(){
  55. // n=read(),m=read();
  56. scanf("%d %d",&n,&m);
  57. s=0,t=(n-1)*(m-1)*2+1;
  58. for(rg int i=1;i<=m-1;++i){
  59. // int w=read();
  60. int w;
  61. scanf("%d",&w);
  62. add(i*2,t,w);
  63. add(t,i*2,w);
  64. }
  65. for(rg int i=2;i<=n-1;++i){
  66. for(rg int j=1;j<=m-1;++j){
  67. // int w=read();
  68. int w;
  69. scanf("%d",&w);
  70. add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2-m*2+1,w);
  71. add((i-1)*(m-1)*2+j*2-m*2+1,(i-1)*(m-1)*2+j*2,w);
  72. }
  73. }
  74. for(rg int i=1;i<=m-1;++i){
  75. // int w=read();
  76. int w;
  77. scanf("%d",&w);
  78. add((n-2)*2*(m-1)+i*2-1,s,w);
  79. add(s,(n-2)*2*(m-1)+i*2-1,w);
  80. }
  81. for(rg int i=1;i<=n-1;++i){
  82. // int w=read();
  83. int w;
  84. scanf("%d",&w);
  85. add((i-1)*(m-1)*2+1,s,w);
  86. add(s,(i-1)*(m-1)*2+1,w);
  87. for(rg int j=1;j<=m-2;++j){
  88. // w=read();
  89. scanf("%d",&w);
  90. add((i-1)*(m-1)*2+j*2+1,(i-1)*(m-1)*2+j*2,w);
  91. add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2+1,w);
  92. }
  93. // w=read();
  94. scanf("%d",&w);
  95. add((i-1)*(m-1)*2+(m-2)*2+2,t,w);
  96. add(t,(i-1)*(m-1)*2+(m-2)*2+2,w);
  97. }
  98. for(rg int i=1;i<=n-1;++i){
  99. for(rg int j=1;j<=m-1;++j){
  100. // int w=read();
  101. int w;
  102. scanf("%d",&w);
  103. add((i-1)*(m-1)*2+j*2-1,(i-1)*(m-1)*2+j*2,w);
  104. add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2-1,w);
  105. }
  106. }
  107. int ans=spfa();
  108. printf("%d",ans);
  109. return 0;
  110. }

【题解】狼抓兔子—BZOJ1001。的更多相关文章

  1. 狼抓兔子 BZOJ- 1001 最小割

    https://www.lydsy.com/JudgeOnline/problem.php?id=1001 一个图,问你花费多少才能把到终点的所有边堵住... 就是求一个最小割,把$(1,1)$和$( ...

  2. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

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

  3. 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解

    [BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 18872  Solved ...

  4. 【BZOJ1001】狼抓兔子(网络流)

    [BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...

  5. 【BZOJ1001】[BeiJing2006]狼抓兔子 对偶图最短路

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

  6. 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)

    [BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...

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

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

  8. 【BZOJ1001】狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 7530  Solved: 1724[Submit][S ...

  9. bzoj1001狼抓兔子 对偶图优化

    bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...

随机推荐

  1. Rabbitmq集群高可用

    转载:https://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html RabbitMQ是用erlang开发的,集群非常方便,因为e ...

  2. process.nextTick

    回调函数同步执行 function asyncFake(data, callback) { if(data === 'foo') { callback(true); }else{ callback(f ...

  3. margin塌陷与margin合并(margin),清除浮动

    **1.margin塌陷**问题:垂直方向的父子关系的盒子使用不当会产生margin塌陷.给子级设置margin-top时,他不会相对父级一起动,只有他的margin超过父级的margin时,才会生效 ...

  4. 三十七、小程序页面跳转传参参数值为url时参数丢失

    当参数的值为url的时候,在options中的值没有参数“?”之后字符串被截取.例如:let url="http://baidu.com/?a=1&b=2"wx.navig ...

  5. java中String的final类原因

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ...

  6. Vue.js 2.x笔记:服务请求axios(8)

    1. axios简介 vue2.0之后,推荐使用axios. axios官方地址:https://github.com/axios/axios 2. axios安装 npm安装: npm instal ...

  7. Excel提取字符串示例

    1.提取两个字符中间的字

  8. [2019.03.20]Linux Shell 执行传参数和expr

    前不久入职实习生,现在在帮着组里面dalao们跑Case,时不时要上去收一下有木有Dump,每次敲命令太烦人于是逼着自己学写Shell脚本.一开始真的是很痛苦啊,也没能搞到书,只能凭网上半真半假的消息 ...

  9. Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) D. Barcelonian Distance 几何代数(简单)

    题意:给出一条直线 ax +by+c=0  给出两个整点 (x1,y1) (x2,y2) 只有在x,y坐标至少有一个整点的时 以及   给出的直线才有路径(也就是格子坐标图的线上) 问 两个整点所需要 ...

  10. 小白月赛13 小A的柱状图 (单调栈)

    链接:https://ac.nowcoder.com/acm/contest/549/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...