[BZOJ] 最长距离
问题描述
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] 最长距离的更多相关文章
- 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]最长距离( 最短路 )
把障碍点看做点(边)权为1, 其他为0. 对于每个点跑spfa, 然后和它距离在T以内的就可以更新答案 ------------------------------------------------ ...
- bzoj 1295 最长距离 - 最短路
Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...
- [BZOJ 1295][SCOI2009]最长距离(SPFA+暴力)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1295 分析:很巧妙的一道spfa从搜索的角度是搜索在所有1中搜索删除哪T个1,对整个图询问,这 ...
- 【BZOJ】1295: [SCOI2009]最长距离(spfa+暴力)
http://www.lydsy.com/JudgeOnline/problem.php?id=1295 咳咳..此题我不会做啊..一开始认为是多源,可是有移除物品的操作,所以不行. 此题的思想很巧妙 ...
- bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 题解: 对每个点暴力跑一遍bfs,看能够到达的最远位置,这里如果有障碍物则距离为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 ...
随机推荐
- xml json mongo
w wuser@ubuntu:~/apiamzpy$ sudo pip install xmljson
- Flask中的对象的配置
常用的有 1.'DEBUG': False, # 是否开启Debug模式 2.'TESTING': False, # 是否开启测试模式 3.'SECRET_KEY': None # 在启用Flask内 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_12-对象数组
对象数组是怎么回事呢? 新建Person类 代码生成后续的代码 生成一个无参构造 两个成员变量都选上,这是全参构造 生成getter和setter 数组的默认的第几0个元素是null 创建三个对象 输 ...
- 【MM系列】SAP MM模块-组织结构介绍
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-组织结构介绍 ...
- ES6新增特性
ES6: ECMA 第六次改版 块级作用域: 凡是被{ }包裹住的代码都是块级作用域,除了对象 特点:会造成一个暂时性死区 新增声明变量的两种方式: let: a. ...
- oracle--序列&视图&索引&视图&可视化操作&分页&数据库备份
--oracle学习内容--oracle的管理系统学习--oracle的数据管理学习--oracle的用户管理--oracle二维表管理--oracle的其他知识 --oracle的序列.视图.索引 ...
- [Python3] 018 if:我终于从分支中走出来了
目录 0. 谁是主角 1. 从三大结构说起 (1) 顺序 (2) 分支 1) 分支的基本语法 2) 双向分支 3) 多路分支 (3) 循环 0. 谁是主角 分支是主角 我前面几篇随笔提到 if 不下2 ...
- HTML: 引号不能忽视
在js中常常生成拼接html,然后放到dom中,但是有些拼接的html标签需要加一些指或者属性,这个时候不能忽略引号 如果data.link_tel有空格,不加单引号导致value的值不完全 str ...
- JAVA总结--正则表达式
正则表达式定义: pattern 对象是一个正则表达式的编译表示.Matcher 对象是对输入字符串进行解释和匹配操作的引擎.PatternSyntaxException 是一个非强制异常类,它表示一 ...
- Java数据结构之链表(Linked List)
1.链表(Linked List)介绍 链表是有序的列表,但是它在内存存储结构如下: 2.特点: 链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节点. 链 ...