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。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int mp[40][40];
  4. char s[40];
  5. int n,m,t;
  6. double ans;
  7. int inq[40][40];
  8. int dis[40][40];
  9. int dx[4]={1,-1,0,0};
  10. int dy[4]={0,0,1,-1};
  11. struct node
  12. {
  13. int x,y;
  14. };
  15. void spfa(int x,int y)
  16. {
  17. memset(inq,0,sizeof(inq));
  18. node now;now.x=x,now.y=y;
  19. for(int i=1;i<=n;i++)
  20. for(int j=1;j<=m;j++)
  21. dis[i][j]=999999;
  22. dis[x][y]=mp[x][y];
  23. queue<node> Q;
  24. Q.push(now);
  25. inq[x][y]=1;
  26. while(!Q.empty())
  27. {
  28. now=Q.front();
  29. Q.pop();
  30. inq[now.x][now.y]=0;
  31. for(int i=0;i<4;i++)
  32. {
  33. node next = now;
  34. next.x+=dx[i];
  35. next.y+=dy[i];
  36. if(next.x<1||next.x>n)continue;
  37. if(next.y<1||next.y>m)continue;
  38. if(dis[next.x][next.y]>dis[now.x][now.y]+mp[next.x][next.y])
  39. {
  40. if(dis[now.x][now.y]+mp[next.x][next.y]>t)continue;
  41. dis[next.x][next.y]=dis[now.x][now.y]+mp[next.x][next.y];
  42. if(!inq[next.x][next.y])
  43. {
  44. Q.push(next);
  45. inq[next.x][next.y]=1;
  46. }
  47. }
  48. }
  49. }
  50. double tmp = 0;
  51. for(int i=1;i<=n;i++)
  52. for(int j=1;j<=m;j++)
  53. if(dis[i][j]<=t)
  54. tmp=max(tmp,sqrt((x-i)*(x-i)+(y-j)*(y-j)));
  55. ans=max(ans,tmp);
  56. }
  57. void solve()
  58. {
  59. for(int i=1;i<=n;i++)
  60. for(int j=1;j<=m;j++)
  61. spfa(i,j);
  62. }
  63. int main()
  64. {
  65. scanf("%d%d%d",&n,&m,&t);
  66. for(int i=1;i<=n;i++)
  67. {
  68. scanf("%s",s+1);
  69. for(int j=1;j<=m;j++)
  70. mp[i][j]=s[j]-'0';
  71. }
  72. solve();
  73. printf("%.6f\n",ans);
  74. }

BZOJ 1295: [SCOI2009]最长距离 spfa的更多相关文章

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

    题目链接 1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1165  Solved: 619[Submit][ ...

  2. BZOJ 1295: [SCOI2009]最长距离( 最短路 )

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

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

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

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

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

  5. 1295: [SCOI2009]最长距离

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

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

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

  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. Mountain Road

    题意: n个车,过一条路,有不同的方向,路上不允许同时有两个方向的车,给出每个车的起始时间,方向,和经过路花费的时间,车最小间隔10个时间,求最后一个车通过路的最早的时间. 分析: dp[i][j][ ...

  2. Linux基本命令(9)定位、查找文件的命令

    定位.查找文件的命令 命令 功能 命令 功能 which 从path中找出文件的位置 find 找出所有符合要求的文件 whereis 找出特定程序的路径 locate 从索引中找出文件位置 9.1 ...

  3. LR之性能分析基础

    1.判断测试结果有效性 2.分析要点提示 3.Analysis主要提供的6大类分析图 4.分析流程

  4. ren

  5. JDK - Tomcat - JSP - Servlet 配置运行全攻略(转)

    http://www.cnblogs.com/myqiao/archive/2005/08/29/225497.html 花了将近两个月的时间,从 JDK 开始一步一步摸索,历经千辛万苦,终于让第一个 ...

  6. strcpy基本用法

    C语言标准库函数strcpy,把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间. C语言函数 原型声明:extern char *strcpy(char* dest, co ...

  7. Spring3 整合Quartz2 实现定时任务

    一.Quartz简介 Quartz是一个由James House创立的开源项目,是一个功能强大的作业调度工具,可以计划的执行任务,定时.循环或在某一个时间来执行我们需要做的事,这可以给我们工作上带来很 ...

  8. Linux文件系统 (Ubunt)

    Linux 文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储 ...

  9. Linux Shell脚本教程

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  10. Linux下静态库生成和使用

    Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...