思路都理解了,清晰了,就是代码不对,还是有些小地方自己注意不到,即使就在你的眼前也不易发现的那种

Description:

  也是一个最大流的构图,没相出来,或者说想简单了也是标记点1 至 n * m是层有物品加边0 - i - 1
XXXXX

我想的是能调跳到安全点的加边i - t - 承受次数
并且还要互相连边,表示可以跳到,但是这样就把限制跳的次数扩大了不是
XXXXX
后来就没再想出来,看看题解后,真是巧妙,拆点
把一个点拆成两个i j 必须从i跳进,跳进后,必须跳到j,限制跳跃次数,从j
上往别的地方跳,就没有了限制,完美的解决了限制次数的问题
所以S = 0;1 - n * m ; n * m + 1 - 2 * n * m;T = 2 * n * m + 1;
这四个部分
第一二部分相连:表示柱子上有没有跳跃的动物,限流为1(因为一个柱子上只能有一个)

如果第二部分可以直接跳出

  那么就第二四部分相连,权值为限制跳跃次数,相当于贪心吧,其实也很合理,来到了这里,能走为什么不走呢,最大流  肯定是走的情况

如果不能走
  第二三部分一一相连:柱子限制的跳跃次数
  第三二部分相连:表示在跳跃范围内,能够跳到的地方(注意距离的计算为曼哈顿距离)限制为inf

基础准备 + 添边 操作

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <stack>
  7. #include <vector>
  8. #define inf (1 << 28)
  9. using namespace std;
  10. const int maxn = 10005;
  11. const int maxm = 50005;
  12. struct edge{
  13. int to,cost,pre;
  14. }e[maxm];
  15. char mp1[25][25];
  16. char mp2[25][25];
  17. int flor[maxn];
  18. int cur[maxn];
  19. int id[maxn],cnt;
  20. int n,d,all;
  21. queue<int>q;
  22. void init()
  23. {
  24. cnt = 0;
  25. all = 0;
  26. memset(id,-1,sizeof(id));
  27. while(q.size())q.pop();
  28. }
  29. void add(int from,int to,int cost)
  30. {
  31. e[cnt].to = to;
  32. e[cnt].cost = cost;
  33. e[cnt].pre = id[from];
  34. id[from] = cnt++;
  35. swap(from,to);
  36. e[cnt].to = to;
  37. e[cnt].cost = 0;
  38. e[cnt].pre = id[from];
  39. id[from] = cnt++;
  40. }

我熟悉的DInic算法(这次debug见到了五花八门的Dinic,嘤嘤嘤)从我的中间输出来看,我debug中是多么的绝望,都当成模拟来做了

  1. bool bfs(int s,int t)
  2. {
  3. memset(flor,0,sizeof(flor));
  4. flor[s] = 1;
  5. while(q.size())q.pop();
  6. q.push(s);
  7. while(q.size())
  8. {
  9. int now = q.front();
  10. q.pop();
  11. // printf("processing %d…………\n",now);
  12. for(int i = id[now];~i;i = e[i].pre)
  13. {
  14. int to = e[i].to;
  15. int cost = e[i].cost;
  16. // printf("\tdata : to = %d cost = %d flor[to] = %d\n",to,cost,flor[to]);
  17. if(flor[to] == 0 && cost > 0)
  18. {
  19. flor[to] = flor[now] + 1;
  20. q.push(to);
  21. // printf("\tNow flor[to] is %d\n",flor[to]);
  22. // printf("\tIN QUEUE %d\n",to);
  23. if(to == t)return true;
  24. }
  25. }
  26. }
  27. return false;
  28. }
  29. int dfs(int s,int t,int f)
  30. {
  31. if(s == t || f == 0) return f;
  32. int ret = f;
  33. for(int &i = cur[s];~i;i = e[i].pre)
  34. {
  35. int to = e[i].to;
  36. int cost = e[i].cost;
  37. int d;
  38. if(cost > 0 && flor[to] == flor[s] + 1 && (d = dfs(to,t,min(f,cost))))
  39. {
  40. e[i].cost -= d;
  41. e[i^1].cost += d;
  42. ret -= d;
  43. if(ret == 0)break;
  44. }
  45. }
  46. if(ret == f)flor[s] = 0;
  47. return f - ret;
  48. }
  49. int dinic(int s,int t)
  50. {
  51. int ret = 0;
  52. while(bfs(s,t))
  53. {
  54. memcpy(cur,id,sizeof(id));
  55. ret += dfs(s,t,inf);
  56. }
  57. return ret;
  58. }

按照建图思想的加边操作

  1. int main()
  2. {
  3. int cas = 0;
  4. int t,m;
  5. scanf("%d",&t);
  6. while(t--)
  7. {
  8. init();
  9. scanf("%d%d",&n,&d);
  10. for(int i = 0;i < n;++i)
  11. {
  12. scanf("%s",mp1[i]);
  13. }
  14. m = strlen(mp1[0]);
  15. for(int i = 0;i < n;++i)
  16. {
  17. scanf("%s",mp2[i]);
  18. }
  19. int t = 2 * n * m + 1;
  20. //printf("s = 0 t = %d n = %d m = %d\n",t,n,m);
  21. for(int i = 0;i < n;++i)
  22. {
  23. for(int j = 0;j < m;++j)
  24. {
  25. int id1 = i*m+j+1;
  26. int id2 = id1 + n*m;
  27. if(mp1[i][j] - '0' > 0)
  28. {
  29.  
  30. //printf("Processing %d %d…………\n",id1,id2);
  31. if(i - d < 0 || j - d < 0 || i + d >= n || j + d >= m)
  32. {
  33. add(id1,t,mp1[i][j] - '0');
  34. // printf("可跳出\n");
  35. // printf("\tadd %d to %d c = %d\n",id1,t,mp1[i][j] - '0');
  36. }
  37. else
  38. {
  39. add(id1,id2,mp1[i][j] - '0');
  40. // printf("不可跳出\n");
  41. // printf("\tadd %d to %d c = %d\n",id1,id2,mp1[i][j] - '0');
  42.  
  43. for(int k = 0;k < n;k++)
  44. {
  45. for(int p = 0;p < m;p++)
  46. {
  47. if(k == i && p == j)continue;
  48. if(abs(i-k) + abs(j - p) > d)continue;
  49. // printf("\t连接临边 …… \n");
  50. add(id2,k*m+p+1,inf);
  51. // printf("\t\tadd %d to %d c = inf",id2,k*m+p+1);
  52. }
  53. }
  54. }
  55. }
  56. if(mp2[i][j] == 'L')
  57. {
  58. // printf("连接初始边\n");
  59. // printf("add 0 to %d c = %d\n",id1,1);
  60. add(0,id1,1);
  61. all++;
  62. }
  63. }
  64. }
  65.  
  66. int s = dinic(0,t);
  67. int op = all - s;
  68. // cout<<all<< " " << s<<endl;
  69. printf("Case #%d: ",++cas);
  70. if(op == 0)
  71. printf("no lizard was left behind.\n");
  72. else if(op == 1)
  73. printf("1 lizard was left behind.\n");
  74. else if(op == 2)
  75. printf("2 lizards were left behind.\n");
  76. else
  77. printf("%d lizards were left behind.\n",op);
  78. }
  79.  
  80. return 0;
  81. }

看了上述内容,我一开始的错误是,第一次ok,第二次答案就错了,常规是没有初始化好东西,经过n次检查,该初始化的都初始化了,不该的也初始化了,还是不对

最后就是初始化不对

模拟之后发现,原来memset(flor数组)的时候只清空了sizeof(flor)的大小,一开始我开的大小是25,(黑脸!!!)

好了,说多了都是泪,找到了,AC了就是好的吧,以后注意!!!这些小细节!

HDU2732一个让我debug了一晚上的题目的更多相关文章

  1. 代码调试--自定义一个简单的debug函数

    function debug(){ $num_args = func_num_args(); //实参个数 $arg_list = func_get_args(); //返回某一个实参,必须是实参数组 ...

  2. 第十三周学习笔记(编辑器选错了重发了这一个 原博客的确周天晚上提交了orz)

    并发:逻辑控制流在时间上的重叠. 构造并发程序的方法: 进程 I/O多路复用 线程 基于进程的并发编程 假设我们有两个客户端和一个服务器,服务器正在监听一个监听表述符上的请求.现在假设服务器接受了客户 ...

  3. vs中debug的一个小技巧 -- debug时忽略某段代码

    #line 这是C#中的预处理命令 Visual Studio 2008 Visual Studio 2005 Visual Studio 2012 #line hidden 指令对调试器隐藏若干连续 ...

  4. ZOJ Goldbach 2013年长沙赛区网络赛

    迟到了一天的AC.... 思路: 先把单个素数 或着 两个素数能组成的情况预处理一下,然后对于给出的 n,拿第三个素数去和两个素数的情况匹配,最后要注意去重. 详情见代码. 因为手残少敲了一个 els ...

  5. iOS enum C方法 DEBUG, RELEASE的隐藏的一个坑

    开发了一个app, 在debug模式下没有任何问题,在release模式下就直接崩溃. 经过一段时间的定位终于定位到如下的这一段代码: E_BZ_TestType type = [dic[@" ...

  6. 就服务器项目部署debug谈谈自己的感受

    前言 学校小组Project那些外国人啥也不会, 基本上我一个人全包了前端和后端, 说实话这些天来也感受到了写一个比较拿得出手的web确实也不是这么容易的, 特别是我没什么项目经验, 很多时候碰到问题 ...

  7. .NET Core的日志[3]:将日志写入Debug窗口

    定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...

  8. Eclipse Debug

    [IT168 专稿]调试的方法虽然千千万万,但归根结底,就是找到引发错误的代码.Eclipse调试器的目标是让程序员能对本地或远程程序进行错误侦测与诊断.该调试器提供所有标准调试功能,包括进行单步执行 ...

  9. RCP:eclipse的DEBUG机制

    Eclipse debug文档翻译 运行一个程序需要添加launch configurable,在自定义launch configuration的时候会指定模式,比如run,debug,profile ...

随机推荐

  1. PAT 甲级 1015 Reversible Primes(20)

    1015 Reversible Primes(20 分) A reversible prime in any number system is a prime whose "reverse& ...

  2. swift 基本用法

    Swift 也提供恒等(===)和不恒等(!==)这两个比较符来判断两个对象是否引用同一个对象实例. 判断字符串相等: let name = "world" if name == ...

  3. UX设计秘诀之注册表单设计,细节决定成败

    以下内容由摹客团队翻译整理,仅供学习交流,摹客iDoc是支持智能标注和切图的产品协作设计神器. 说实话,现实生活中,又有多少人会真正喜欢填写表格?显然,并不多.因为填写表单这样的网页或App服务,并非 ...

  4. 之前的一些Oracle的经验总结

    1. 安装: 1) 关于字符集的选择,现在还不很了解,修改是需要进入一个模式下才可以修改,当然新建一个数据库实例的时候可以重新设定: UTF8是相对比较大的一个字符集, 可以简单实用这个就能保存很多的 ...

  5. Java学习笔记:多线程(一)

    Java中线程的五种状态: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 凋亡状态(Dead) 其中阻塞状态(Blocked)又分为三种: ...

  6. CSS学习笔记:盒子模型

    盒子模型(CSS basic box model):When laying out a document, the browser's rendering engine represents each ...

  7. SQL 创建联合主键Table

    CREATE TABLE [User_Instance]( [IntanceID] [int] NOT NULL, ) NOT NULL ) ON [PRIMARY] GO SET ANSI_PADD ...

  8. mybatis缓存(一,二级别)

    数据查找过程: 二级缓存(默认关闭) -> 一级缓存(默认开启) -> 数据库 一级缓存: 一级缓存是SqlSession自带的.SqlSession对象被创建,一级缓存就存在了.//是针 ...

  9. 【WebService】WebService之CXF的拦截器(五)

    CXF拦截器介绍 CXF拦截器是功能的主要实现单元,也是主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加功能.当服务被调用时,会经过多个拦截器链(Interceptor Chain)处理,拦 ...

  10. [C#.net]Connection Timeout和Command Timeout

    每次对数据库连接时,我们有时候会碰到连接超时或者命令超时,这两个超时是不一样的.以ADO.NET为例,当客户端和服务器端连接时,碰到的超时情况主要有下面几种: 当从连接池获取一个连接时,碰到超时. 当 ...