Description

windy有一块矩形土地,被分为 N*M 块 1*1 的小格子。 有的格子含有障碍物。 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离。 如果从格子A不可以走到格子B,就没有距离。 如果格子X和格子Y有公共边,并且X和Y均不含有障碍物,就可以从X走到Y。 如果windy可以移走T块障碍物,求所有格子间的最大距离。 保证移走T块障碍物以后,至少有一个格子不含有障碍物。

Input

输入文件maxlength.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示空格子,'1'表示该格子含有障碍物。

Output

输出文件maxlength.out包含一个浮点数,保留6位小数。

Sample Input

【输入样例一】
3 3 0
001
001
110

【输入样例二】
4 3 0
001
001
011
000

【输入样例三】
3 3 1
001
001
001

Sample Output

【输出样例一】
1.414214

【输出样例二】
3.605551

【输出样例三】
2.828427

HINT

20%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 0 。 40%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 2 。 100%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 30 。


题目大意

  一个$N \times M$的网格上有些格子是障碍。如果两个非障碍格子四连通,那么定义它们之间的距离为他们的欧几里德距离,否则它们没有距离。

  现在你可以把其中的$T$个障碍格子变为非障碍格子,然后问,操作后中有距离的点对中最长的距离是多少。

  由于$N, M$数据范围小到爆,所以可以直接枚举从哪个格子开始清理障碍格子,用最短路算法跑出到每个格子最少清楚的障碍格子数,然后暴力枚举所有可行的格子,计算它和当前枚举的格子的欧几里德距离,然后更新答案。

Code

 /**
* bzoj
* Problem#1295
* Accepted
* Time: 724ms
* Memory: 1312k
*/
#include <bits/stdc++.h>
using namespace std; typedef bool boolean;
#define pii pair<int, int>
#define fi first
#define sc second const int N = ; int n, m, k;
int val[N][N];
int f[N][N];
boolean vis[N][N];
int ans = ;
char str[N]; inline void init() {
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i < n; i++) {
scanf("%s", str);
for (int j = ; j < m; j++)
val[i][j] = str[j] - '';
}
} const int mov[][] = {{, }, {-, }, {, }, {, -}}; queue<pii> que;
void spfa(pii s) {
memset(f, 0x3f, sizeof(f));
que.push(s);
f[s.fi][s.sc] = val[s.fi][s.sc];
while (!que.empty()) {
pii e = que.front();
que.pop();
vis[e.fi][e.sc] = false;
for (int d = ; d < ; d++) {
pii eu (e.fi + mov[d][], e.sc + mov[d][]);
if (eu.fi < || eu.fi >= n || eu.sc < || eu.sc >= m)
continue;
if (f[e.fi][e.sc] + val[eu.fi][eu.sc] < f[eu.fi][eu.sc]) {
f[eu.fi][eu.sc] = f[e.fi][e.sc] + val[eu.fi][eu.sc];
if (!vis[eu.fi][eu.sc]) {
vis[eu.fi][eu.sc] = true;
que.push(eu);
}
}
}
}
} inline void solve() {
for (int i = ; i < n; i++)
for (int j = ; j < m; j++) {
spfa(pii(i, j));
for (int x = ; x < n; x++)
for (int y = ; y < m; y++) {
if (f[x][y] <= k)
ans = max(ans, (x - i) * (x - i) + (y - j) * (y - j));
}
}
printf("%.6lf\n", sqrt((double)ans));
} int main() {
init();
solve();
return ;
}

bzoj 1295 最长距离 - 最短路的更多相关文章

  1. BZOJ 1295 最长距离 BFS+枚举

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1295 题目大意: windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有 ...

  2. BZOJ 1295: [SCOI2009]最长距离( 最短路 )

    把障碍点看做点(边)权为1, 其他为0. 对于每个点跑spfa, 然后和它距离在T以内的就可以更新答案 ------------------------------------------------ ...

  3. bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 题解: 对每个点暴力跑一遍bfs,看能够到达的最远位置,这里如果有障碍物则距离为1 ...

  4. BZOJ 1295: [SCOI2009]最长距离 spfa

    1295: [SCOI2009]最长距离 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 Description windy有一块 ...

  5. bzoj 1295: [SCOI2009]最长距离

    题目链接 1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1165  Solved: 619[Submit][ ...

  6. [BZOJ 1295][SCOI2009]最长距离(SPFA+暴力)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1295 分析:很巧妙的一道spfa从搜索的角度是搜索在所有1中搜索删除哪T个1,对整个图询问,这 ...

  7. 【BZOJ 1295】 [SCOI2009]最长距离

    Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...

  8. bzoj 1295 1295: [SCOI2009]最长距离

    思路:对于每个点出发bfs做一次dp, dp[ i ][ j ][ k ] 表示从枚举的该点能不能经过k个障碍物到达(i , j). #include<bits/stdc++.h> #de ...

  9. [BZOJ1295][SCOI2009]最长距离 最短路+枚举

    1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1683  Solved: 912[Submit][Statu ...

随机推荐

  1. android 通过页面上关键字快速定位代码

    这里定位微信关于页面, 当然可以直接获取当前最顶层activity 反编译apk后 搜索 strings.xml,找到对应id 搜索文件到用到id对应的成员变量,通常 是在R*.smali文件中 字符 ...

  2. C\C++程序结束另外的进程

    WinExec("taskkill /f /im center_flextrbo.exe",SW_HIDE);

  3. Android Studio -- 关联源码

    1,昨天刚把SDK升级到25,然后准备开始 新的一年码代码,结果发现查看源码的时候出现了一堆的“ throw new RuntimeException("Stub!");” 网上搜 ...

  4. SQL中的关联更新和关联删除

    在SQL中,经常用到关联查询,比如select a.* from A a inner join B b on a.PId=b.FId where 条件,SQL中也支持类似的关联更新和关联删除. 关联更 ...

  5. c# 图像呈现控件PictureBox

    在c#中可以使用PictureBox控件来呈现图像,图像资源可以来自文件,也可以是存在内存中的位图对象.可以显示本地图像文件或来自网络的图片,也可以来自项目文件中的图像. 从URI加载图像文件. 调用 ...

  6. github开源的一些ip解析 ,运营商信息,经纬度 地址 后续开发使用

    https://github.com/wzhe06/ipdatabase  ip解析 https://github.com/flyaction/ipdatabase 比较新 https://githu ...

  7. c#测试执行时间的方法

    获取当前实例测量出来的总的运行时间 Stopwatch sp = new Stopwatch(); sp.Start(); //要测试的代码块 sp.Stop(); Console.WriteLine ...

  8. jboss的使用和安装

    1. 安装 1.1.软件安装 首先要安装JDK(仅仅安装JRE是不行的,因为JSP页面需要编译),最新的正式版是JDK1.4.2.然后把JBoss的压缩包解压到一个目录下,目录名一般是"Jb ...

  9. DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)

    汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC): ;------------------------------------------------ ;功能: 读取PCI 配 ...

  10. Python3 实现 JS 中 RSA 加密的 NoPadding 模式

    前因后果之哗啦啦废话连篇: 这几天本人在 Python 做某网站登陆的时候,发现其登陆时用户名和密码被加密了 F12 仔细看了一下,发现是调用了一个 js 的 rsa 加密库,页面 dom 中有 rs ...