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

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

基础准备 + 添边 操作

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#define inf (1 << 28)
using namespace std;
const int maxn = 10005;
const int maxm = 50005;
struct edge{
int to,cost,pre;
}e[maxm];
char mp1[25][25];
char mp2[25][25];
int flor[maxn];
int cur[maxn];
int id[maxn],cnt;
int n,d,all;
queue<int>q;
void init()
{
cnt = 0;
all = 0;
memset(id,-1,sizeof(id));
while(q.size())q.pop();
}
void add(int from,int to,int cost)
{
e[cnt].to = to;
e[cnt].cost = cost;
e[cnt].pre = id[from];
id[from] = cnt++;
swap(from,to);
e[cnt].to = to;
e[cnt].cost = 0;
e[cnt].pre = id[from];
id[from] = cnt++;
}

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

bool bfs(int s,int t)
{
memset(flor,0,sizeof(flor));
flor[s] = 1;
while(q.size())q.pop();
q.push(s);
while(q.size())
{
int now = q.front();
q.pop();
// printf("processing %d…………\n",now);
for(int i = id[now];~i;i = e[i].pre)
{
int to = e[i].to;
int cost = e[i].cost;
// printf("\tdata : to = %d cost = %d flor[to] = %d\n",to,cost,flor[to]);
if(flor[to] == 0 && cost > 0)
{
flor[to] = flor[now] + 1;
q.push(to);
// printf("\tNow flor[to] is %d\n",flor[to]);
// printf("\tIN QUEUE %d\n",to);
if(to == t)return true;
}
}
}
return false;
}
int dfs(int s,int t,int f)
{
if(s == t || f == 0) return f;
int ret = f;
for(int &i = cur[s];~i;i = e[i].pre)
{
int to = e[i].to;
int cost = e[i].cost;
int d;
if(cost > 0 && flor[to] == flor[s] + 1 && (d = dfs(to,t,min(f,cost))))
{
e[i].cost -= d;
e[i^1].cost += d;
ret -= d;
if(ret == 0)break;
}
}
if(ret == f)flor[s] = 0;
return f - ret;
}
int dinic(int s,int t)
{
int ret = 0;
while(bfs(s,t))
{
memcpy(cur,id,sizeof(id));
ret += dfs(s,t,inf);
}
return ret;
}

按照建图思想的加边操作

int main()
{
int cas = 0;
int t,m;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&d);
for(int i = 0;i < n;++i)
{
scanf("%s",mp1[i]);
}
m = strlen(mp1[0]);
for(int i = 0;i < n;++i)
{
scanf("%s",mp2[i]);
}
int t = 2 * n * m + 1;
//printf("s = 0 t = %d n = %d m = %d\n",t,n,m);
for(int i = 0;i < n;++i)
{
for(int j = 0;j < m;++j)
{
int id1 = i*m+j+1;
int id2 = id1 + n*m;
if(mp1[i][j] - '0' > 0)
{ //printf("Processing %d %d…………\n",id1,id2);
if(i - d < 0 || j - d < 0 || i + d >= n || j + d >= m)
{
add(id1,t,mp1[i][j] - '0');
// printf("可跳出\n");
// printf("\tadd %d to %d c = %d\n",id1,t,mp1[i][j] - '0');
}
else
{
add(id1,id2,mp1[i][j] - '0');
// printf("不可跳出\n");
// printf("\tadd %d to %d c = %d\n",id1,id2,mp1[i][j] - '0'); for(int k = 0;k < n;k++)
{
for(int p = 0;p < m;p++)
{
if(k == i && p == j)continue;
if(abs(i-k) + abs(j - p) > d)continue;
// printf("\t连接临边 …… \n");
add(id2,k*m+p+1,inf);
// printf("\t\tadd %d to %d c = inf",id2,k*m+p+1);
}
}
}
}
if(mp2[i][j] == 'L')
{
// printf("连接初始边\n");
// printf("add 0 to %d c = %d\n",id1,1);
add(0,id1,1);
all++;
}
}
} int s = dinic(0,t);
int op = all - s;
// cout<<all<< " " << s<<endl;
printf("Case #%d: ",++cas);
if(op == 0)
printf("no lizard was left behind.\n");
else if(op == 1)
printf("1 lizard was left behind.\n");
else if(op == 2)
printf("2 lizards were left behind.\n");
else
printf("%d lizards were left behind.\n",op);
} return 0;
}

看了上述内容,我一开始的错误是,第一次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. What is MaxiSys Pro MS908P Software Advantage

    The Autel Maxisys Pro Diagnostic Platform is an evolutionary smart solution for specialized automoti ...

  2. centos7 下安装mongodb指南;

    1.下载:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.1.tgz; 2.解压缩; 3.文件存储在mongodb文件 ...

  3. HTML的基本知识点

    <!DOCTYPE HTML> <html> <body> <video width="320" height="240&quo ...

  4. Reduce 和 Transduce 的含义

    一.reduce 的用法 reduce是一种数组运算,通常用于将数组的所有成员"累积"为一个值. var arr = [1, 2, 3, 4]; var sum = (a, b) ...

  5. 【Web】网页字体图标的使用

    字体图标介绍 网页中图片有很多优点,但也有很多缺点,会增加文件的大小以及增加http请求.这时候就需要用的字体图标(iconfont).字体图标的优点,可以跟图片一样改变透明度.旋转等,本质上是文字, ...

  6. 企业IT资产管理功能大全

  7. git版本控制工具的使用(3)

    git remote查看远程库的信息get remote -v可以更详细,查看推送和抓取权限 git push origin master把本地的master提交到远程的库对应的主分支 gt push ...

  8. python学习 day6 (3月7日)

    #__author : 'liuyang' #date : 2019/3/7 0007 a = ['a' , 'b' , 'c'] b = [] print(a is b ) # 空元组 可以 空列表 ...

  9. linux_配置三台虚拟机免密登录

    在node01上面直接生成公钥和私钥 ssh-keygen --> 四下回车 ll -a 进行查看,发现出现.ssh文件即已经生成 将此node01的公钥拷贝到第二台机器上 ssh-copy-i ...

  10. trunc()用法和add_months()

    TRUNC函数用于对值进行截断. 用法有两种:TRUNC(NUMBER)表示截断数字,TRUNC(date)表示截断日期. (1)截断数字: 格式:TRUNC(n1,n2),n1表示被截断的数字,n2 ...