bzoj 1295 最长距离 - 最短路
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 最长距离 - 最短路的更多相关文章
- BZOJ 1295 最长距离 BFS+枚举
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1295 题目大意: windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有 ...
- BZOJ 1295: [SCOI2009]最长距离( 最短路 )
把障碍点看做点(边)权为1, 其他为0. 对于每个点跑spfa, 然后和它距离在T以内的就可以更新答案 ------------------------------------------------ ...
- bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 题解: 对每个点暴力跑一遍bfs,看能够到达的最远位置,这里如果有障碍物则距离为1 ...
- BZOJ 1295: [SCOI2009]最长距离 spfa
1295: [SCOI2009]最长距离 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 Description windy有一块 ...
- bzoj 1295: [SCOI2009]最长距离
题目链接 1295: [SCOI2009]最长距离 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1165 Solved: 619[Submit][ ...
- [BZOJ 1295][SCOI2009]最长距离(SPFA+暴力)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1295 分析:很巧妙的一道spfa从搜索的角度是搜索在所有1中搜索删除哪T个1,对整个图询问,这 ...
- 【BZOJ 1295】 [SCOI2009]最长距离
Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...
- bzoj 1295 1295: [SCOI2009]最长距离
思路:对于每个点出发bfs做一次dp, dp[ i ][ j ][ k ] 表示从枚举的该点能不能经过k个障碍物到达(i , j). #include<bits/stdc++.h> #de ...
- [BZOJ1295][SCOI2009]最长距离 最短路+枚举
1295: [SCOI2009]最长距离 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1683 Solved: 912[Submit][Statu ...
随机推荐
- cocos2dx 3.x(纯代码实现弹出对话框/提示框/警告框)
头文件: // // PopAlertDialog.h // macstudycocos2dx // // Created by WangWei on 15/6/8. // // #ifndef ...
- gitlab RPM卸载 & 安装 && 升级(9.0.13-》9.5.9-》10.0->10.3.9->10.6.6-》10.8-》11.0)
版本:9.0.3 升级版本:9.0.13 一,停止服务 gitlab-ctl stop unicorn gitlab-ctl stop sidekiq gitlab-ctl stop nginx 二, ...
- 编写一种递归方法,它返回数N的二进制中表示1的个数。
/** * 编写一种递归方法,它返回数N的二进制中表示1的个数.利用这样一个事实:N为奇数,其1的个数为N/2的二进制中1的个数加1. * @author wulei * */public class ...
- jQuery-手风琴伸缩效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- java资料共享
1.javascript视频教程 链接: http://pan.baidu.com/s/1gd57FVH 密码: d9ei 2.JPA视频教程 链接: http://pan.baidu.com/s/1 ...
- rpm方式安装MySQL5.1.73
1.安装MySQL server 首先下载好mysql的rpm安装包 使用rpm命令安装: rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rpm 命令解释:i ...
- Sql 嵌套循环
DECLARE @i INT ,@j INT BEGIN PRINT 'satrt i:'+CAST(@i AS varchar) BEGIN PRINT 'j:'+CAST(@j AS varcha ...
- Robot Framework 教程 (3) - Resource及关键字 的使用
From:http://www.cnblogs.com/buaawp/p/4754399.html Robot Framework 教程 (3) - Resource及关键字 的使用 在进行软件自动化 ...
- 20155228 获取技能的成功经验和关于C语言学习的调查
内容提要 你有什么技能比大多人(超过90%以上)更好?针对这个技能的获取你有什么成功的经验?与老师博客中的学习经验有什么共通之处? 有关C语言学习的调查 你是怎么学习C语言的?(作业,实验,教材,其他 ...
- python pymssql 连接数据库
1)写在前面 远程连接数据库的时候,端口前面都是用的逗号, 因为惯性思维, 就傻傻的把 ip+,+端口 赋值给server了,然后一直报错, pymssql.InterfaceError: Co ...