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. AIX挂载NFS写入效率低效解决

    背景: Linux是NFS的Server端,AIX是NFS的Client端(此外,有一个Linux也作为Client端对比测试). 1.NFS对应的底层设备是闪存卡,本地测试I/O写性能可达2GB/s ...

  2. 【网络设备】某防火墙基于IP地址的目的地址转换

    由于来自Internet的对政府,企业的网络攻击日益频繁,因此需要对内网中向外网提供访问服务的关键设备进行有效保护.采用目的地址NAT可以有效地将内部网络地址对外隐藏. 图中:公网中Internet用 ...

  3. InstallShield2015制作安装包----------安装后实现电脑开机自启动

    开机自启动有两个方法: 一 .把程序的快捷方式放在”开始---启动“目录下. 二.把程序的安装目录放在注册表”“. 实现方法一: 1.编写bat脚本.执行bat启动exe. a)核心:cmd命令  : ...

  4. Mac虚拟机上使用Genumotion模拟器

    在Mac虚拟机系统上开发ReactNative的IOS应用非常方便,只要安装Xcode即可,  但 Android应用就需要三个步骤: 首先声明,下载Android SDK会非常慢,最好有快速的网络或 ...

  5. Oracle TNS-01190: The user is not authorized to execute the requested listener command

    今天,在玩 lsnrctl命令,是为了了解Oracle的一些配置. 当执行 show inbound_connect_timeout 命令之后,提示了错误信息: TNS-01190: The user ...

  6. 从caffemodel里面导出参数

    参见博文https://blog.csdn.net/u014510375/article/details/51704447

  7. spring自带的定时任务功能@EnableScheduling

    1 demo package com.test.domi.config; import org.springframework.beans.factory.annotation.Configurabl ...

  8. awk命令学习(1)

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  9. WebAppInitializer类,代替web.xml

    package com.ssm.yjblogs.config; import javax.servlet.MultipartConfigElement; import javax.servlet.Se ...

  10. codeforces 980C Posterized

    题意: 255个像素格子,可以把这个255个分组,每组的大小不能超过k. 给出n个像素,要求每个像素用这组的key代表,并且表示出来的字典序要最小. 思路: 感谢js教本智障. 很自然的会想到贪心,也 ...