http://www.lydsy.com/JudgeOnline/problem.php?id=1295

咳咳。。此题我不会做啊。。一开始认为是多源,可是有移除物品的操作,所以不行。

此题的思想很巧妙!

我们不妨将问题转换一下,对于一个点到另一个点,我们只需算出到达这个点最少需要移除多少个障碍,然后用题目给的障碍判断是否可行,然后暴力算出可行的点之间的欧几里得距离就行了orz。

T_T

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define read(a) a=getnum()
#define print(a) printf("%d", a)
inline int getnum() { int ret=0; char c; for(c=getchar(); c<'0' || c>'9'; c=getchar()); for(; c>='0' && c<='9'; c=getchar()) ret=ret*10+c-'0'; return ret; } const int N=35;
int d[N][N], a[N][N], vis[N][N], ans, n, m;
int dx[]={-1, 1, 0, 0}, dy[]={0, 0, -1, +1};
struct qu{ int x, y; } q[N*N*2];
int front, tail; void spfa(const int &s, const int &t) {
int x, y;
CC(vis, 0); CC(d, 0x7f);
d[s][t]=front=tail=0;
vis[s][t]=1; q[tail].x=s, q[tail++].y=t;
while(front<tail) {
x=q[front].x; y=q[front++].y;
rep(i, 4) if(x+dx[i] && x+dx[i]<=n && y+dy[i] && y+dy[i]<=m && d[x][y]+a[x+dx[i]][y+dy[i]]<d[x+dx[i]][y+dy[i]]) {
d[x+dx[i]][y+dy[i]]=d[x][y]+a[x+dx[i]][y+dy[i]];
if(!vis[x+dx[i]][y+dy[i]]) {
vis[x+dx[i]][y+dy[i]]=1;
q[tail].x=x+dx[i]; q[tail++].y=y+dy[i];
}
}
vis[x][y]=0;
}
} int main() {
read(n); read(m);
int t=getnum();
char c;
for1(i, 1, n) for1(j, 1, m) {
for(c=getchar(); c<'0' || c>'9'; c=getchar());
a[i][j]=c-'0';
}
int t1;
for1(i, 1, n) for1(j, 1, m) {
spfa(i, j);
t1=t; if(a[i][j]) --t1;
for1(x, 1, n) for1(y, 1, m) if(d[x][y]<=t1)
ans=max(ans, (i-x)*(i-x)+(j-y)*(j-y));
}
printf("%.6lf", sqrt((double)ans));
return 0;
}

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 。

Source

【BZOJ】1295: [SCOI2009]最长距离(spfa+暴力)的更多相关文章

  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][SCOI2009]最长距离(SPFA+暴力)

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

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

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

  6. 1295: [SCOI2009]最长距离

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

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

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

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

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

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

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

随机推荐

  1. HDU3345广搜 (P,E,T,#)

    War chess is hh's favorite game:In this game, there is an N * M battle map, and every player has his ...

  2. postgresql 函数demo

    create or replace function refresh_product_usage() returns void as $$ declare rec record; sub_rec re ...

  3. BZOJ 1058

    服气!我果然就是个傻逼. 傻兮兮地感觉两个数之间的差距无需删除一些答案,妈个鸡就只加入了一些新的答案忘记了去掉无效的答案.我果然是傻逼,经验不足脑子笨... 这么水的题...不说了,说多了都是泪. 自 ...

  4. 【云计算】docker build如何支持参数化构建?

    docker 1.9.0版本之后,已经支持docker build参数化构建. docker 版本更新记录: github讨论: 参开资料: https://github.com/docker/doc ...

  5. mysql导入和导出数据

    Linux下如何单个库进行导入和备份操作 1.将数据导入数据库mysql -u账号 -p密码 数据库<sql脚本 mysql -uroot -proot test</home/upload ...

  6. (原创)Python文件与文件系统系列(4)——文件描述字操作

    文件描述字(file descriptor,fd)是系统中用来唯一记录当前已经打开的文件的标识号,fd是一个整数. 除了file对象外,Python还提供对fd的操作,对fd的操作更加底层,fd和Py ...

  7. Java for LeetCode 033 Search in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  8. BaseColumns以及自定义Column

    android provider 包下自带的BaseColumn /* * Copyright (C) 2006 The Android Open Source Project * * License ...

  9. typedef用法

    参考文章:http://www.cnblogs.com/shenlian/archive/2011/05/21/2053149.html

  10. Android_adb shell am/pm使用

    转自:http://blog.sina.com.cn/s/blog_51335a0001017ux5.html   adb shell am instrument [options] <COMP ...