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

------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<queue>
#include<cmath>
 
using namespace std;
 
#define id(x, y) ((x) * M + (y))
#define check(x, y) ((x) >= 0 && (x) < N && (y) >= 0 && (y) < M)
 
const int dir[4][2] = {{-1, 0}, {0, 1}, {0, -1}, {1, 0}};
const int maxn = 909;
 
struct edge {
int to;
edge* next;
} E[200000], *pt = E, *head[maxn];
 
void AddEdge(int u, int v) {
pt->to = v; pt->next = head[u]; head[u] = pt++;
}
 
int N, M, T, n, w[maxn], d[maxn];
deque<int> q;
bool inq[maxn];
double ans = 0;
 
double dist(int x, int y, int _x, int _y) {
return sqrt((x - _x) * (x - _x) + (y - _y) * (y - _y));
}
 
void calculate(int X, int Y) {
int s = id(X, Y);
for(int i = N * M; i--; )
d[i] = maxn, inq[i] = false;
d[s] = w[s]; inq[s] = true; q.push_front(s);
while(!q.empty()) {
int x = q.front(); q.pop_front(); inq[x] = false;
for(edge* e = head[x]; e; e = e->next) if(d[e->to] > d[x] + w[e->to]) {
d[e->to] = d[x] + w[e->to];
if(inq[e->to]) continue;
inq[e->to] = true;
(!q.empty() && d[q.front()] > d[e->to]) ? q.push_front(e->to) : q.push_back(e->to);
}
}
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++) 
if(d[id(i, j)] <= T) ans = max(ans, dist(i, j, X, Y));
}
 
void init() {
scanf("%d%d%d", &N, &M, &T);
for(int i = 0; i < N; i++) 
for(int j = 0; j < M; j++) {
char c = getchar();
for(; !isdigit(c); c = getchar());
w[id(i, j)] = c - '0';
}
}
 
int main() {
init();
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
for(int k = 0; k < 4; k++) {
int x = i + dir[k][0], y = j + dir[k][1];
if(check(x, y)) AddEdge(id(i, j), id(x, y));
}
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++) calculate(i, j);
printf("%.6lf\n", ans);
return 0;
}

------------------------------------------------------------------------

1295: [SCOI2009]最长距离

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1105  Solved: 590
[Submit][Status][Discuss]

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]最长距离( 最短路 )的更多相关文章

  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]最长距离 暴力+bfs最短路

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

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

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

  5. 1295: [SCOI2009]最长距离

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

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

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

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

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

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

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

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

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

随机推荐

  1. querySelectorAll 和 jQuery选择器

    参考 http://xahlee.info/js/jquery_diff_querySelectorAll.html http://stackoverflow.com/questions/115035 ...

  2. 《windows程序设计》学习_3.1:画出雷区,左键的使用

    #include<windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPAR ...

  3. 几个学习Maven不错的网址

    几个学习Maven不错的网址:---------------------------------------------------1.Maven官方网站 http://maven.apache.or ...

  4. java的抽象类

    现实世界中,人们表征世界时,会把现实世界中的很多类具有相同特征的事物归为一个抽象类.比如水果是许多植物果实的总称,我们可以定义一个苹果类.定义一个西瓜类,可以实例化一个苹果对象,可以实例化一个西瓜对象 ...

  5. 刷新指定行或区 cell

    //一个section刷新 NSIndexSet *indexSetA = [[NSIndexSet alloc]initWithIndex:3];    //刷新第3段 [tableview rel ...

  6. hdu 2777(线段树)

    这道题是看了别人的思路才做出来的. 刚看完这道题没什么思路,线段的长度是10^5,操作指令数是10^5,还要记录不同颜色种类数,觉着怎么写肯定都是要超时.我当时在节点里增加了一个数组记录已经出现的颜色 ...

  7. C++ signal的使用

    1.头文件 #include  <signal.h> 2.功能 设置某一信号的对应动作 3.函数原型 typdef  void  (*sighandler_t )(int); sighan ...

  8. 在不同Activity之间传递数据的四种常用方法

    在Android中传递数据的方法非常多,本次介绍4中比较常用的数据传递方法: 1.通过Intent传递数据 2.通过静态变量(static)传递数据 3.通过剪贴板(Clipboard)传递数据 4. ...

  9. .NET连接SAP系统专题:.NET调用RFC几种方式(一)

    本来今天是要写一篇关于NCO3.0的东西,就是关乎.NET调用SAP的RFC的,支持VS2010和.NET 4.0等.现在网上到处都是充斥着NCO1.X和NCO2.0,需要用VS2003来使用,都是一 ...

  10. 【微信公众号】WeixinJSBridge.call('closeWindow')无效

    公众号上面使用iframe嵌套子页面,然而子页面无法使用WeixinJSBridge.call('closeWindow') 这时候必须在函数前面加上parent.,比如parent.WeixinJS ...