BZOJ 1295: [SCOI2009]最长距离 spfa
题目连接:
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);
}
转载于:https://www.cnblogs.com/qscqesze/p/5065027.html
BZOJ 1295: [SCOI2009]最长距离 spfa相关推荐
- bzoj 1295: [SCOI2009]最长距离(SPFA)
1295: [SCOI2009]最长距离 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1697 Solved: 919 [Submit][Sta ...
- bzoj 1295: [SCOI2009]最长距离
题目链接 1295: [SCOI2009]最长距离 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1165 Solved: 619 [Submit ...
- BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详(并不)解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多 ...
- SCOI2009 最长距离
洛谷 BZOJ 分析 图论题.直接 \(dfs\) 加一点剪枝就能过了. 代码 #include <cmath> #include <cstdio> #include < ...
- BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)
Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit ...
- BZOJ 1026 [SCOI2009]windy数
1026: [SCOI2009]windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间 ...
- [SCOI2009]最长距离
Description windy有一块矩形土地,被分为 NM 块 11 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格子A ...
- bzoj:1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 7982 Solved: 3593 Descriptio ...
- BZOJ 2763: [JLOI2011]飞行路线 【SPFA】
Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Al ...
最新文章
- Apache配置--用户认证(针对目录访问)-update2015-05-02
- [ffmpeg]安装
- 判断resultset是否遍历到最后一条记录_干货:一条SQL语句执行得很慢的原因
- iOS开发的一些奇巧淫技2
- rabbitmq常用配置
- mysql模糊查询 % , _ ,[], [^] 的区别
- 79. 单词搜索(dfs)
- mfc程序转化为qt_小峰的QT学习笔记
- java中有关线程的题目
- eclipse信息输出区没有logcat的解决方法
- cwinthread*线程指针怎么销毁结束_C++知识点:智能指针
- 软件工程 speedsnail 第二次冲刺1次
- 装上这 10个vscode插件,python才真的是无敌的存在!
- RJ45口线序的理解
- linux中的计划任务
- 浅谈Sun Solaris启动
- 教你如何用C/C++做高大上的软件界面
- ES 之 Routing
- Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片
- excel不显示0_Excel数值为0不显示的三种解决方法