题目传送门

经过长时间的旅行,很长时间没写过博客了,这次把上次WA的题目过了。

由于每次蜥蜴从石柱上跳下时,石柱的高度会-1,可以看做占了一格的流量。

建图:

  1.建超级源和超级汇,设超级源连到每只蜥蜴的边容量为1,每个可以跳到外面的点连到超级汇的边的容量为maxlongint。

  2.对于每个点建一个虚点,连边到此虚点,边容量为该点石柱高度。对于每个可以互相跳到的点,建立容量为maxlongint的边。这样当前点到其他点的总容量为该点的石柱高度。(拆点)

然后跑一遍Dinic就好了。

注意用蜥蜴的总数减去最大流才是答案。

code:

  1. /**************************************************************
  2. Problem: 1066
  3. User: yekehe
  4. Language: C++
  5. Result: Accepted
  6. Time:40 ms
  7. Memory:6380 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <string>
  12. #include <cstring>
  13. #include <iostream>
  14. using namespace std;
  15.  
  16. int r,c,d,a[][],L;
  17. string S;
  18.  
  19. int head[],nxt[],W[],To[],cnt;
  20. void add(int x,int y,int c)
  21. {
  22. W[cnt]=c;
  23. To[cnt]=y;
  24. nxt[cnt]=head[x];
  25. head[x]=cnt;
  26. cnt++;
  27. }
  28.  
  29. int check(int x,int y,int fx,int fy)
  30. {
  31. return (x-fx)*(x-fx)+(y-fy)*(y-fy)<=d*d;
  32. }
  33.  
  34. int l[],dist[];
  35. int BFS()
  36. {
  37. int tl=,hd=;
  38. hd=tl=;
  39. l[++tl]=;
  40. memset(dist,-,sizeof dist);
  41. dist[]=;
  42. while(hd<tl){
  43. int front=l[++hd];
  44. for(int i=head[front];i!=-;i=nxt[i]){
  45. if(dist[To[i]]==- && W[i]){
  46. dist[To[i]]=dist[front]+;
  47. l[++tl]=To[i];
  48. }
  49. }
  50. }
  51. return dist[r*c*+]!=-;
  52. }
  53.  
  54. int DFS(int now,int x)
  55. {
  56. if(now==r*c*+ || !x)return x;
  57. int res=;
  58. for(int i=head[now];i!=- && x;i=nxt[i]){
  59. if(dist[now]+==dist[To[i]]&&W[i]){
  60. int DK=DFS(To[i],min(x,W[i]));
  61. W[i]-=DK;W[i^]+=DK;
  62. x-=DK;res+=DK;
  63. }
  64. }
  65. if(!res)dist[now]=-;
  66. return res;
  67. }
  68.  
  69. void Dinic()
  70. {
  71. int ans=;
  72. while(BFS())
  73. ans+=DFS(,2e9);
  74. printf("%d",L-ans);
  75. return ;
  76. }
  77.  
  78. int main()
  79. {
  80. // freopen("x.txt","r",stdin);
  81. scanf("%d%d%d",&r,&c,&d);
  82. memset(nxt,-,sizeof nxt);
  83. memset(head,-,sizeof head);
  84. register int i,j,k,h;
  85. #define Size ( r*c )
  86. #define fr ( (i-1)*c+j )
  87. #define to ( (k-1)*c+h )
  88. for(i=;i<=r;i++){
  89. cin>>S;
  90. for(j=;j<S.size();j++){
  91. a[i][j+]=S[j]-'';
  92. }
  93. }
  94. for(i=;i<=r;i++){
  95. cin>>S;
  96. for(j=;j<=S.size();j++){
  97. if(S[j-]=='L'){
  98. L++;//求蜥蜴总数
  99. add(,fr,);
  100. add(fr,,);
  101. }
  102. }
  103. }
  104. for(i=;i<=r;i++)
  105. for(j=;j<=c;j++){
  106. if(!a[i][j])continue;
  107. add(fr,fr+Size,a[i][j]);
  108. add(fr+Size,fr,);
  109. for(k=;k<=r;k++)
  110. for(h=;h<=c;h++){
  111. if(i==k&&j==h)continue;
  112. if(a[k][h]/*减少边的总量*/&&check(i,j,k,h)){
  113. add(fr+Size,to,2e9);
  114. add(to,fr+Size,);
  115. }
  116. }
  117. }
  118. for(i=;i<=r;i++)
  119. for(j=;j<=c;j++){
  120. if(i<=d || j<=d || r-i+<=d || c-j+<=d){
  121. if(!a[i][j])continue;//减少边的总量
  122. add(fr+Size,Size<<|,2e9);
  123. add(Size<<|,fr+Size,);
  124. }
  125. }
  126. Dinic();
  127. return ;
  128. }

BZOJ1066_蜥蜴_KEY的更多相关文章

  1. 1066: [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3545  Solved: 1771[Submit][Status] ...

  2. bzoj 1066 蜥蜴

    最大流. 建图:首先将每根柱子拆成两个点. 每根柱子的入点向出点连一条容量为柱子高度的边. 每根柱子的出点向可以到达的柱子的入点连一条容量为正无穷的边. 源点向每根初始有蜥蜴的柱子的入点连一条容量为一 ...

  3. BZOJ 1066 【SCOI2007】 蜥蜴

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为$1$,蜥蜴的跳跃距离是d,即蜥蜴可以跳 ...

  4. 蜥蜴(bzoj 1066)

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平 ...

  5. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...

  6. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

    与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit:  ...

  7. 【bzoj1066】[SCOI2007]蜥蜴 网络最大流

    [bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...

  8. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...

  9. BZOJ1066 [SCOI2007]蜥蜴

    首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...

随机推荐

  1. Python 冒泡排序法分析

    冒泡排序法 def maopao(): array = [2,1,3,6,5,4] #确定一组需要排序的数值列表 for i in range(len(array)-1): #大循环次数=列表长度,但 ...

  2. ZOJ-3286 Very Simple Counting---因子数打表

    题目链接: https://cn.vjudge.net/problem/ZOJ-3286 题目大意: f(n)为n的因子个数 求出有多少个f(i)使得f(i) == f(n) && i ...

  3. UVa 1608 - Non-boring sequences

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. C/C++心得-结构体

    先说句题外话,个人认为,基本上所有的高级语言被设计出来的最终目的是降低软件开发难度,提升软件开发人员素质和团队协作能力,降低软件维护的难度.在学习语言的时候,可以从这么方面来推测各种语言语法设计的原因 ...

  5. Yii2.0 请求

    1.获取请求参数 $request = Yii::$app->request; $get = $request->get(); // 等价于:$get = $_GET; $id = $re ...

  6. PHP中将字符串转化为整数(int) intval() printf()

    int <?php $foo = "1"; // $foo 是字符串类型 $bar = (int)$foo; // $bar 是整型 ?> intval <?ph ...

  7. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件

    “/”应用程序中的服务器错误. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“c552ea94-6fbb-11d5-a9c1-00104bb6fc1c”. 说明: 执行当前 Web ...

  8. PAT——1006. 换个格式输出整数

    1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...

  9. window7及以上 创建软链接 mklink

    软链接是一种文件共享方式. 命令:mklink /d "C:\d" "C:\e" 有哪些坑: 1.此命名必须以管理员方式在cmd运行 2.文件必须不存在..通过 ...

  10. Unity 游戏框架搭建 (二十二) 简易引用计数器

    引用计数是一个很好用的技术概念,不要被这个名字吓到了.首先来讲讲引用计数是干嘛的. 引用计数使用场景 有一间黑色的屋子,里边有一盏灯.当第一个人进屋的时候灯会打开,之后的人进来则不用再次打开了,因为已 ...