题目描述

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: 复制

3 3 0

001

001

110

输出样例#1: 复制

1.414214

输入样例#2: 复制

4 3 0

001

001

011

000

输出样例#2: 复制

3.605551

输入样例#3: 复制

3 3 1

001

001

001

Sample Output

输出样例#3: 复制

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 。

Solution

数据范围30,30,只有900个点,跑900次\(dijkstra\),复杂度\(n^2logn\),这里跑的最短路跑的是一个点到另一个点所至少需要走的障碍数,貌似能过,再暴力枚举两个点\(n^2\)判断能不能到达,就这样了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
struct node
{
int to,next,w;
}a[5010000];
typedef pair<int,int> pr;
priority_queue<pr,vector<pr>,greater<pr> >q;
int len,last[1010010],vis[1010],d[1001][1001],mp[1000][1000],n,m,t;
int ar[]={0,0,1,-1};
int br[]={1,-1,0,0};
void add(int a1,int a2,int a3)
{
a[++len].to=a2;
a[len].w=a3;
a[len].next=last[a1];
last[a1]=len;
}
int real(int x,int y)
{
return (x-1)*m+y;
}
void dijkstra(int s)
{
memset(vis,0,sizeof(vis));
d[s][s]=0;q.push((pr){0,s});
while(!q.empty())
{
int k=q.top().second;q.pop();
if(vis[k]) continue;
vis[k]=1;
for(int i=last[k];i;i=a[i].next)
{
int to=a[i].to;
if(d[s][to]>d[s][k]+a[i].w)
{
d[s][to]=d[s][k]+a[i].w;
if(!vis[to])
q.push((pr){d[s][to],to});
}
}
}
}
double dis(int i,int j,int x,int y)
{
return sqrt((i-x)*(i-x)+(j-y)*(j-y));
}
int main()
{
char s[50];
memset(d,0x3f,sizeof(d));
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=m;j++)
if(s[j]=='1') mp[i][j]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
for(int k=0;k<=3;k++)
{
int x=i+ar[k],y=j+br[k];
if(x==0||y==0||x==n+1||y==m+1) continue;
add(real(i,j),real(x,y),mp[x][y]);
}
}
double ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dijkstra(real(i,j));
// cout<<d[8][1]<<endl;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int x=1;x<=n;x++)
for(int y=1;y<=m;y++)
{
int p1=real(i,j),p2=real(x,y);
if(mp[i][j]) continue;
if(d[p1][p2]<=t)
{
double pp=dis(i,j,x,y);
if(ans<pp)
ans=pp;
}
}
printf("%.6lf",ans);
}

博主蒟蒻,可以随意转载,但必须附上原文链接k-z-j

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

  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. 1295: [SCOI2009]最长距离

    1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 960  Solved: 498[Submit][Status ...

  5. 【BZOJ1295】[SCOI2009]最长距离(最短路)

    [BZOJ1295][SCOI2009]最长距离(最短路) 题面 BZOJ 洛谷 题解 这题很妙啊. 我们枚举一个点,只需要考虑到他的最远点就行了,显然只需要考虑一个点即可.那么这两个点之前联通的最小 ...

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

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

  7. BZOJ_1295_[SCOI2009]最长距离_dij

    BZOJ_1295_[SCOI2009]最长距离_dij Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那 ...

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

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

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

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

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

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

随机推荐

  1. Python入门--15--文件读取、保存

    先看文件读取,open 1.文件打开模式: 打开模式 执行操作 'r' 以只读方式打开文件(默认) 'w'    以写入的方式打开文件,会覆盖已存在的文件 'x' 如果文件已经存在,使用此模式打开将引 ...

  2. AC日记——圆桌聚餐 cogs 729

    729. [网络流24题] 圆桌聚餐 ★★   输入文件:roundtable.in   输出文件:roundtable.out   评测插件时间限制:1 s   内存限制:128 MB «问题描述: ...

  3. js-判断移动端用户是横屏放的还是竖屏放的

    在一些移动端页面中,页面的样式我们就支持竖屏播放,这时我们就需要判断是横屏还是竖屏了,不同的方向显示冉的样式. //判断手机横屏竖屏 var html = ""; window.a ...

  4. 焦作F Modular Production Line 费用流

    题目链接 题解:这道题比赛的时候,学弟说是网络流,当时看N这么大,觉得网络流没法做,实际本题通过巧妙的建图,然后离散化. 先说下建图方式,首先每个覆盖区域,只有左右端点,如果我们只用左右端点的话,最多 ...

  5. BZOJ2243 [SDOI2011]染色(树链剖分+线段树合并)

    题目链接 BZOJ2243 树链剖分 $+$ 线段树 线段树每个节点维护$lc$, $rc$, $s$ $lc$代表该区间的最左端的颜色,$rc$代表该区间的最右端的颜色 $s$代表该区间的所有连续颜 ...

  6. 华硕win7安装ubuntu14.04.02注意事项

    一.win7下划出给ubuntu系统的分区 1.win7自带分磁盘的工具,只需要压缩步骤即可,不需要继续分盘符格式化等操作 win7下为绿色 安装时为free space 二.制作启动盘并安装注意事项 ...

  7. java retry:详解

    发现 今天在探秘线程池原理知识点,在阅读JDK源码时遇到程序代码中出现如下代码,因为之前没有遇到过,于是特地记录下来并谷歌了一番,后面我自己做了一些简要的验证和分析. 验证 网上溜达一番发现,这ret ...

  8. Cesium 显示CZML数据

    转自文章 Cesium随笔(5)CZML介绍(介个文章是转的嘿嘿) 通过czml可以在cesium上实现非常棒的动态效果   CZML的结构   CZML是一种用来描述动态场景的JSON架构的语言,主 ...

  9. 【Linxu】CentOS7下安装程序报错:

    进入root用户,然后编辑 vi /usr/libexec/urlgrabber-ext-down 将首行换成 #!/usr/bin/python2.

  10. Go -- 接口赋值

    在go语言中,接口赋值分为2中情况: 1.将对象实例赋值给接口: 2.将一个接口赋值给另一个接口. 1.将对象实例赋值给接口: 要求对象实现了接口的所有方法. 2.将接口赋值给另一个接口: 假设接口A ...