问题描述

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

输入格式

第一行包含三个整数,N M T。

接下来有 N 行,每行一个长度为 M 的字符串,'0'表示空格子,'1'表示该格子含有障碍物。

输出格式

输出包含一个浮点数,保留 6 位小数。

样例输入输出

输入输出样例 1

Input

3 3 0

001

001

110

Output

1.414214

输入输出样例 2

Input

4 3 0

001

001

011

000

Output

3.605551

输入输出样例 3

Input

3 3 1

001

001

001

Output

2.828427

数据范围

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

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

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

解析

可以发现,题目的重点在于最长的欧氏距离而不是删哪T个点,那么只要求出两个相距最远的点使其之间的路径最少经过的障碍点的数量小于T即可。接下来的问题是如何求出两点之间最少经过的障碍点。联想到最短路,对每个点跑一边Dijkstra即可。

代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#include <iomanip>
#define N 32
#define M 902
using namespace std;
int head[M],ver[M*4],nxt[M*4],edge[M*4],ll;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
char c[N];
int n,m,t,i,j,k,l,a[N][N],f[M][M];
bool vis[M];
void insert(int x,int y,int z)
{
ll++;
ver[ll]=y;
edge[ll]=z;
nxt[ll]=head[x];
head[x]=ll;
}
bool in(int x,int y)
{
return x<=n&&x>=1&&y<=m&&y>=1;
}
int get(int x,int y)
{
return (x-1)*n+y;
}
void Dijkstra(int s)
{
priority_queue<pair<int,int> > q;
memset(vis,0,sizeof(vis));
q.push(make_pair(0,s));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(f[s][y]>f[s][x]+edge[i]){
f[s][y]=f[s][x]+edge[i];
q.push(make_pair(-f[s][y],y));
}
}
}
}
double dis(int x1,int y1,int x2,int y2)
{
return sqrt(1.0*(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
memset(f,0x3f,sizeof(f));
cin>>n>>m>>t;
for(i=1;i<=n;i++){
cin>>c;
for(j=0;j<m;j++) a[i][j+1]=c[j]-'0';
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
for(k=0;k<4;k++){
int x=i+dx[k],y=j+dy[k];
if(in(x,y)) insert(get(i,j),get(x,y),a[x][y]);
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
int x=get(i,j);
f[x][x]=a[i][j];
Dijkstra(x);
}
}
double ans=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
for(k=1;k<=n;k++){
for(l=1;l<=m;l++){
int x=get(i,j),y=get(k,l);
if(x!=y&&f[x][y]<=t) ans=max(ans,dis(i,j,k,l));
}
}
}
}
cout<<setprecision(6)<<fixed<<ans<<endl;
return 0;
}

[BZOJ] 最长距离的更多相关文章

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

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

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

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

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

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

  4. bzoj 1295 最长距离 - 最短路

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

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

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

  6. 【BZOJ】1295: [SCOI2009]最长距离(spfa+暴力)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1295 咳咳..此题我不会做啊..一开始认为是多源,可是有移除物品的操作,所以不行. 此题的思想很巧妙 ...

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

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

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

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

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

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

随机推荐

  1. Splinter 的认识和基础应用

    Splinter 是一个使用Python开发的开源web应用测试程序,它可以帮助我们实现自动浏览站点和与其进行交互.它是依赖于其它python插件或拓展进行的,所以我们使用它之前需要安装一系列的依赖包 ...

  2. Apache2.4常用编译参数

    转载文章,亲试 Apache2.4以后的版本编译依赖apr,所以,编译之前需要先安装apr及apr-util. 编译参数只是一个参考作用,这个参数是我平常使用的,具体工作中的需求还是要区别对待的 一些 ...

  3. C#中查找或结束程序域中的主、子进程

    有时候,我们的程序需要启动一些子进程,如嵌入的图形程序. 当启动一个进程后,获得这个进程信息Process,然后其内部在某个时刻启动了一个子进程,这个时候就涉及程序域和进程树的概念.当我们通过非正常操 ...

  4. hacker101教学笔记--introduction--the web in depth

    hacker101笔记 提前准备:运行java的环境 burp proxy(代理) firefox(浏览器) xss 可以控制参数,发送JavaScript到服务器,再从服务器反映到浏览器上面< ...

  5. mooc-IDEA 快速通过mapper定位到XML

    intellij 快速通过mapper定位到XML 方法一:在线安装Mybatis插件 安装完毕,重启IDEA生效! =>Mapper文件效果 点击向下键头即可定位到XML文件中的具体SQL = ...

  6. CentOS7 破解登录密码

    1.重启系统,在出现下面这个界面时按e 2.进入之后方向键的下,找到“LANG=en_US.UTF-8",在这个命令后面输入“rd.break",完成之后按ctrl+x进入紧急救援 ...

  7. 《剑指offer》面试题15 链表中的倒数第k个节点 Java版

    书中方法:用两个节点一次遍历求得倒数第k个节点.注意头节点为空,k<=0,k大于节点个数的情况. public ListNode find(ListNode head, int k){ if(h ...

  8. Monitor HDU6514 二维差分入门学习

    Monitor HDU 6514 二维差分入门学习 题意 小腾有\(n*m\)的田地,但是有小偷来偷东西,在一片矩形区域上,有一部分区域是监控可以覆盖到的,这部分区域由一个或多个包含于该矩形区域的小矩 ...

  9. SQL语句-exec执行

    动态sql语句基本语法1 :普通SQL语句可以用Exec执行 eg:   Select * fromtableName        Exec('select * from tableName')   ...

  10. Java 遇到的困难

    (1)需求:xml 转 json 依赖的包:commons-beanutils-1.8.3.jarcommons-collections-3.2.1.jarcommons-lang-2.6.jarco ...