BZOJ 1295: [SCOI2009]最长距离 spfa
1295: [SCOI2009]最长距离
题目连接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1295
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
Sample Output
4 3 0
001
001
011
000
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 。
题意
题解:
数据范围只有30*30,我们就可以直接枚举起点,然后对于每个点都跑一边spfa,看究竟这个点移动T个障碍物最多能够到那儿就好了。
然后再暴力更新ans。
代码
#include<bits/stdc++.h>
using namespace std;
int mp[40][40];
char s[40];
int n,m,t;
double ans;
int inq[40][40];
int dis[40][40];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
struct node
{
int x,y;
};
void spfa(int x,int y)
{
memset(inq,0,sizeof(inq));
node now;now.x=x,now.y=y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dis[i][j]=999999;
dis[x][y]=mp[x][y];
queue<node> Q;
Q.push(now);
inq[x][y]=1;
while(!Q.empty())
{
now=Q.front();
Q.pop();
inq[now.x][now.y]=0;
for(int i=0;i<4;i++)
{
node next = now;
next.x+=dx[i];
next.y+=dy[i];
if(next.x<1||next.x>n)continue;
if(next.y<1||next.y>m)continue;
if(dis[next.x][next.y]>dis[now.x][now.y]+mp[next.x][next.y])
{
if(dis[now.x][now.y]+mp[next.x][next.y]>t)continue;
dis[next.x][next.y]=dis[now.x][now.y]+mp[next.x][next.y];
if(!inq[next.x][next.y])
{
Q.push(next);
inq[next.x][next.y]=1;
}
}
}
}
double tmp = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(dis[i][j]<=t)
tmp=max(tmp,sqrt((x-i)*(x-i)+(y-j)*(y-j)));
ans=max(ans,tmp);
}
void solve()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
spfa(i,j);
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=m;j++)
mp[i][j]=s[j]-'0';
}
solve();
printf("%.6f\n",ans);
}
BZOJ 1295: [SCOI2009]最长距离 spfa的更多相关文章
- 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][SCOI2009]最长距离(SPFA+暴力)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1295 分析:很巧妙的一道spfa从搜索的角度是搜索在所有1中搜索删除哪T个1,对整个图询问,这 ...
- bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 题解: 对每个点暴力跑一遍bfs,看能够到达的最远位置,这里如果有障碍物则距离为1 ...
- 1295: [SCOI2009]最长距离
1295: [SCOI2009]最长距离 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 960 Solved: 498[Submit][Status ...
- 【BZOJ】1295: [SCOI2009]最长距离(spfa+暴力)
http://www.lydsy.com/JudgeOnline/problem.php?id=1295 咳咳..此题我不会做啊..一开始认为是多源,可是有移除物品的操作,所以不行. 此题的思想很巧妙 ...
- bzoj 1295 1295: [SCOI2009]最长距离
思路:对于每个点出发bfs做一次dp, dp[ i ][ j ][ k ] 表示从枚举的该点能不能经过k个障碍物到达(i , j). #include<bits/stdc++.h> #de ...
- 1295. [SCOI2009]最长距离【最短路】
Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...
- [BZOJ1295][SCOI2009]最长距离 最短路+枚举
1295: [SCOI2009]最长距离 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1683 Solved: 912[Submit][Statu ...
随机推荐
- 怎样学法学?——民法学泰斗王利明教授的演讲 z
今晚我讲“怎样学习法律”,但不是讲一般的学习法学的方法,而是主要从法学.法律的特征讲起.(因为)我们学习任何东西,都首先要搞清楚我们的学习对象有什么特征.性质. 我们要了解法律.法学本身的性质,要了解 ...
- LR 解决中文乱码(来源——百度)
因为我们使用的中文操作系统默认的中文编码格式是GB2312,所以LR对服务器的返回内容自动使用GB2312方式阅读的,但是几乎所有的中文网站现在都在使用UTF-8的方式来编码,由于解码编码的方式不同最 ...
- 链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 返回了消息 "未指定的错误"。[手稿]
消息 7302,级别 16,状态 1,第 1 行 无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.JET.OLEDB.4.0&qu ...
- 【LeetCode】237 & 203 - Delete Node in a Linked List & Remove Linked List Elements
237 - Delete Node in a Linked List Write a function to delete a node (except the tail) in a singly l ...
- Mac OS X 10.9 编译C++11
Notice: How to compile C++ with C++ 11 support in Mac Terminal stackoverflow上面的问题 其实mac里面的不是g++而是cla ...
- 输出(test)
本题要求从输入的N个整数中查找给定的X.如果找到,输出X的位置(从0开始数):如果没有找到,输出“Not Found”. 输入格式: 输入在第1行中给出2个正整数N(<=20)和X,第2行给出N ...
- python用法笔记(数组(list、touple、dict)、字符串)
1.产生n个全为1的数组a=[1]*n2.字符数字转化int('12')float('12.5')str(123.45)ASCII码转为相应的字符:chr(97)字符转化为相应的ASCII码:ord( ...
- gem 相关命令
gem #查看gem源 gem sources # 删除默认的gem源 gem sources --remove http://rubygems.org/ # 增加taobao作为gem源 gem s ...
- 轻松学习Linux之AWK使用初步
AWK最初是Unix平台上一种可以对文本进行逐行处理的编程语言,它来源于3个创作者的名字:Aho.(Peter)Weinberg和(Brain)Kernighan. 现在广泛应用于Linux,他与se ...
- 第二百零一天 how can I坚持
sql要学的东西还很多,很简单的一个sql都不会写,还得请教别人,哎. 八千代.铜钱草,小叶元宝,绿萝.还有我的鱼,还有罗娜. 今天试用了一下三星,系统优化就是不行啊,掉电太快,想搞个小米5,还想买个 ...