题目链接


题意:就是给你这样的N*M的点(其中M还没有给出,但是M可以算得),然后先输出N、D,N行,D是每个青蛙能跳的距离(欧拉距离,以为是曼哈顿距离的我WA了两发…… QAQ),然后是第一张N*M的图,代表着的是每个点能被起跳的次数,从它起跳需要消耗一次,然后第二幅N*M的图代表的是是否有青蛙。

直接最大流就是了,但是这里的D可能会>3,其他人错的原因,我完全是被卡了欧拉距离。


#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define esp 1e-6
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int S = 0, maxN = 1e3 + 7, maxE = 4e4 + 7;
int N, M, D, head[maxN], cur[maxN], cnt, T, all;
#define _id(x, y) (x - 1) * M + y
char num[25][25], lea[25][25];
struct Eddge
{int nex, to, flow;Eddge(int a=-1, int b=0, int c=0):nex(a), to(b), flow(c) {}
}edge[maxE];
inline void addEddge(int u, int v, int flow)
{edge[cnt] = Eddge(head[u], v, flow);head[u] = cnt++;
}
inline void _add(int u, int v, int flow) { addEddge(u, v, flow); addEddge(v, u, 0); }
bool check(int x, int y) { return x <= D || y <= D || N - x < D || M - y < D; }
bool In_Map(int x, int y) { return x >= 1 && y >= 1 && x <= N && y <= M; }
bool _link(int x1, int y1, int x2, int y2) { return sqrt( (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) ) <= D; }
int deep[maxN];
queue<int> Q;
bool bfs()
{memset(deep, 0, sizeof(deep));  while(!Q.empty()) Q.pop();Q.push(S);  deep[S] = 1;while(!Q.empty()){int u = Q.front();  Q.pop();for(int i=head[u], v, f; ~i; i=edge[i].nex){v = edge[i].to; f = edge[i].flow;if(f && !deep[v]){deep[v] = deep[u] + 1;Q.push(v);}}}return deep[T];
}
int dfs(int u, int dist)
{if(u == T) return dist;for(int &i=cur[u], v, f, di; ~i; i=edge[i].nex){v = edge[i].to; f = edge[i].flow;if(f && deep[v] == deep[u] + 1){di = dfs(v, min(dist, f));if(di){edge[i].flow -= di;edge[i^1].flow += di;return di;}}}return 0;
}
int Dinic()
{int ans = 0, tmp;while(bfs()){memcpy(cur, head, sizeof(cur));while((tmp = dfs(S, INF))) ans += tmp;}return ans;
}
inline void init()
{cnt = all = 0;    T = N * M + 401;memset(head, -1, sizeof(head));
}
int main()
{int tt;  scanf("%d", &tt);for(int Cas=1; Cas<=tt; Cas++){scanf("%d%d", &N, &D);for(int i=1; i<=N; i++) scanf("%s", num[i] + 1);for(int i=1; i<=N; i++) scanf("%s", lea[i] + 1);M = (int)strlen(num[1] + 1);init();for(int i=1; i<=N; i++){for(int j=1; j<=M; j++){if(num[i][j] > '0') _add(_id(i, j), _id(i, j) + 400, num[i][j] - '0');if(check(i, j)) _add(_id(i, j) + 400, T, INF);/*for(int dx = 0; dx <= D; dx++){for(int dy = 0; dy <= D - dx; dy++){if(!dx && !dy) continue;if(In_Map(i + dx, j + dy)) _add(_id(i, j) + 400, _id(i + dx, j + dy), INF);if(In_Map(i - dx, j - dy)) _add(_id(i, j) + 400, _id(i - dx, j - dy), INF);if(In_Map(i - dx, j + dy)) _add(_id(i, j) + 400, _id(i - dx, j + dy), INF);if(In_Map(i + dx, j - dy)) _add(_id(i, j) + 400, _id(i + dx, j - dy), INF);}}*/for(int dx=1; dx<=N; dx++) for(int dy=1; dy<=M; dy++){if(dx == i && dy == j) continue;if(_link(i, j, dx, dy)) _add(_id(i, j) + 400, _id(dx, dy), INF);}}}for(int i=1; i<=N; i++){for(int j=1; j<=M; j++){if(lea[i][j] == 'L'){_add(S, _id(i, j), 1);all++;}}}int ans = all - Dinic();printf("Case #%d: ", Cas);if(!ans) printf("no lizard was left behind.\n");else if(ans == 1) printf("1 lizard was left behind.\n");else printf("%d lizards were left behind.\n", ans);}return 0;
}

Leapin' Lizards 【HDU - 2732】【最大流】相关推荐

  1. Leapin' Lizards HDU - 2732 (恶心的建图。。)

    这道题其实不难...就是建图恶心了点....emm... 题意: 多源多汇 + 拆边 青蛙跳柱子, 每根柱子都有一定的承载能力, 青蛙跳上去之后柱子的承载能力就会减一,跳到边界就能活 跳不到就over ...

  2. HDU-2732 Leapin' Lizards(网络流)

    HDU-2732 Leapin' Lizards(网络流) Your platoon of wandering lizards has entered a strange room in the la ...

  3. HDU - 2732 Leapin' Lizards(最大流+思维建边)

    题目链接:点击查看 题目大意:给出两个n*m的迷宫,第一个迷宫中表示每个柱子的耐久度,第二个迷宫表示的是每一只蜥蜴的位置,现在给出每只蜥蜴可以跳跃的最大曼哈顿距离,规定跳出迷宫边界就可以逃离迷宫,现在 ...

  4. HDU Problem - 2732 Leapin' Lizards(最大流,拆点建边)

    题目链接 Problem Description Your platoon of wandering lizards has entered a strange room in the labyrin ...

  5. hdu 2732 Leapin' Lizards (经典网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2732 Your platoon of wandering lizards has entered a ...

  6. HDU 2732 Leapin' Lizards

    传送门 这道题应用了网络流,主要考的是怎么转化为网络流求解,重点是怎么建图. 题意是给你一个n*m网格,每个格子可能有一个柱子,也可能没柱子,每个柱子上有一个最大跳出次数,用完了这个柱子就废了,每个柱 ...

  7. 【HDOJ】2732 Leapin' Lizards

    贪心+网络流.对于每个结点,构建入点和出点. 对于每一个lizard>0,构建边s->in position of lizard, 容量为1. 对于pillar>0, 构建边in p ...

  8. HDU-2732 Leapin' Lizards 最大流

    题目意思是有一些蜥蜴在一个迷宫里面,求这些蜥蜴还有多少是无论如何都逃不出来的.题目只给定一个行数,一个最远能够跳跃的距离,列数是不确定的(题目告知列数小于等于20),但是数据一定会是一个矩阵.每只蜥蜴 ...

  9. Leapin' Lizards(拆点+最大流建模)

    这是一道关于蜥蜴的题,光是题意就读了许久,这道题可以说是考察的很全面了,个人认为题目很好,可以多敲几遍练练手. 难点:1.读题. 题意大概是这样的,有一只蜥蜴,在一个房子里,输入第一个数T说明有T组. ...

最新文章

  1. 成都Uber优步司机奖励政策(2月1日)
  2. 下面方框中,那些包括有220欧姆的电阻呢?
  3. Javascript 函数声明和函数表达式的区别
  4. 微信支付报错:统一下单和拉起支付的appid不一致(原创)
  5. 上线到凌晨4点半 pagehelper的bug?
  6. 【测试】测试用例8大法
  7. SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine
  8. 3D游戏中的画质与效率适配(转)
  9. 2.6.28内核的进程load_balance
  10. delphi代码在linux编译运行,[教程] Delphi 10.2 Linux 程序开发环境部署的基本步骤
  11. linux机顶盒线刷教程,网络机顶盒刷机教程和详细方法,实现软件任意安装,电视免费看...
  12. 数据处理之缺失值处理
  13. CANoe 入门 Step by step系列(二)CAPL编程
  14. windows系统软件崩溃分析
  15. 开源SWD脱机烧录器-第二章 SWD协议移植
  16. 电力作业虚拟仿真培训教学平台的功能及特色介绍
  17. vue中xlsx导出多个sheet页
  18. 负载均衡进阶:SLB常见问题解决方法
  19. 人工智能、深度学习、机器学习常见面试题56~70
  20. 笔记本卡顿不流畅是什么原因_笔记本卡顿不流畅是什么原因_笔记本电脑卡顿不流畅如何解决-win7之家...

热门文章

  1. 什么是序列化?如何实现序列化
  2. 苹果首款自研PCM1芯片居然吊打因特尔 !这款苹果M1芯片能“擎天”
  3. SIGINT、SIGKILL和SIGTERM的区别
  4. 1到10的阶乘 java_java里1到10的阶乘相加编程怎么做?
  5. android 启动音乐播放器,无法启动android默认音乐播放器与开始活动
  6. EAGAIN、EWOULDBLOCK、EINTR与非阻塞
  7. 海康大华华为宇视等监控摄像头通过GB28181协议接入到LiveGBS流媒体平台如何给监控摄像头加水印...
  8. Arcgis去除黑色背景值的有效方法!!!
  9. 免费分享20套微信小程序源码 源码免费下载【强烈推荐】
  10. 生化实验技术——蓝白斑筛选