HDU2732一个让我debug了一晚上的题目
思路都理解了,清晰了,就是代码不对,还是有些小地方自己注意不到,即使就在你的眼前也不易发现的那种
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了一晚上的题目的更多相关文章
- 代码调试--自定义一个简单的debug函数
function debug(){ $num_args = func_num_args(); //实参个数 $arg_list = func_get_args(); //返回某一个实参,必须是实参数组 ...
- 第十三周学习笔记(编辑器选错了重发了这一个 原博客的确周天晚上提交了orz)
并发:逻辑控制流在时间上的重叠. 构造并发程序的方法: 进程 I/O多路复用 线程 基于进程的并发编程 假设我们有两个客户端和一个服务器,服务器正在监听一个监听表述符上的请求.现在假设服务器接受了客户 ...
- vs中debug的一个小技巧 -- debug时忽略某段代码
#line 这是C#中的预处理命令 Visual Studio 2008 Visual Studio 2005 Visual Studio 2012 #line hidden 指令对调试器隐藏若干连续 ...
- ZOJ Goldbach 2013年长沙赛区网络赛
迟到了一天的AC.... 思路: 先把单个素数 或着 两个素数能组成的情况预处理一下,然后对于给出的 n,拿第三个素数去和两个素数的情况匹配,最后要注意去重. 详情见代码. 因为手残少敲了一个 els ...
- iOS enum C方法 DEBUG, RELEASE的隐藏的一个坑
开发了一个app, 在debug模式下没有任何问题,在release模式下就直接崩溃. 经过一段时间的定位终于定位到如下的这一段代码: E_BZ_TestType type = [dic[@" ...
- 就服务器项目部署debug谈谈自己的感受
前言 学校小组Project那些外国人啥也不会, 基本上我一个人全包了前端和后端, 说实话这些天来也感受到了写一个比较拿得出手的web确实也不是这么容易的, 特别是我没什么项目经验, 很多时候碰到问题 ...
- .NET Core的日志[3]:将日志写入Debug窗口
定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...
- Eclipse Debug
[IT168 专稿]调试的方法虽然千千万万,但归根结底,就是找到引发错误的代码.Eclipse调试器的目标是让程序员能对本地或远程程序进行错误侦测与诊断.该调试器提供所有标准调试功能,包括进行单步执行 ...
- RCP:eclipse的DEBUG机制
Eclipse debug文档翻译 运行一个程序需要添加launch configurable,在自定义launch configuration的时候会指定模式,比如run,debug,profile ...
随机推荐
- 使用RSS订阅
1.绪论 对某一主题完成一次文献检索后,我们希望能持续了解该主题最新文献,即实现文献追踪. 为此,搜索引擎和数据库厂商(数据源)提供一般两种订阅服务:邮件和RSS.订阅后,数据源会自动推送最新信息,免 ...
- PAT 1067 试密码(20)(代码)
1067 试密码(20 分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度 ...
- iOS.Operation-on-ZipFile
Operation on ZipFile Reference 在Mac OS X和iOS中操作.zip文件(例如创建zip文件, 从zip文件中抽取数据): 1. http://stackoverfl ...
- CButtonST|CUniButton等按钮类的使用
CButtonST CButtonST类的使用参考链接:http://www.cnblogs.com/lidabo/archive/2012/12/17/2821122.html CCeButtonS ...
- 爬虫初窥day4:requests
Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 ...
- .net判断当前时间是否在工作时间段内
整理代码,判断当前时间是否在配置的工作时间段内,代码如下: public static bool getTimeSpan(string _strWorkingDayAM, string _strWor ...
- JUC知识点总结图
转载http://www.jsondream.com/2017/06/12/about-JUC.html
- rails 辅助方法
rails辅助方法全解: https://ruby-china.github.io/rails-guides/routing.html
- python 中 __name__ 的使用
1. 如果模块是被导入,__name__的值为模块名字2. 如果模块是被直接执行,__name__的值为’__main__’ Py1.py #!/usr/bin/env python def te ...
- Le Chapitre V
Chaque jour j'apprennais quelque chose sur la planète, sur le départ, sur le voyage. Ca venait tout ...