码迷,mamicode.com
首页 > 其他好文 > 详细

(SPFA) bzoj 1295

时间:2015-02-01 10:45:34      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

1295: [SCOI2009]最长距离

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 922  Solved: 478
[Submit][Status]

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
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 0x7fffffff
queue<int> q;
int n,m,t,a[50][50],vis[50][50],d[50][50];
int dic[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char s[50][50];
double dis(int i,int j,int ii,int jj)
{
      return sqrt((double)((ii-i)*(ii-i)+(jj-j)*(jj-j)));
}
bool check(int x,int y)
{
      if(x<0||y<0||x>=n||y>=m)
            return false;
      return true;
}
void SPFA(int sx,int sy)
{
     int xx,yy;
     while(!q.empty()) q.pop();
     memset(vis,0,sizeof(vis));
     for(int i=0;i<n;i++)
     {
           for(int j=0;j<m;j++)
                  d[i][j]=INF;
     }
     vis[sx][sy]=1;
     d[sx][sy]=a[sx][sy];
     q.push(sx),q.push(sy);
     while(!q.empty())
     {
           int x,y;
           x=q.front(),q.pop();
           y=q.front(),q.pop();
           for(int i=0;i<4;i++)
           {
                 xx=x+dic[i][0],yy=y+dic[i][1];
                 if(!check(xx,yy)) continue;
                 if(d[x][y]+a[xx][yy]<d[xx][yy]&&d[x][y]+a[xx][yy]<=t)
                 {
                       d[xx][yy]=d[x][y]+a[xx][yy];
                       if(!vis[xx][yy])
                       {
                             vis[xx][yy]=1;
                             q.push(xx),q.push(yy);
                       }
                 }
           }
           vis[x][y]=0;
     }
}
int main()
{
      double ans;
      memset(a,0,sizeof(a));
      scanf("%d%d%d",&n,&m,&t);
      for(int i=0;i<n;i++)
            scanf("%s",s[i]);
      for(int i=0;i<n;i++)
      {
            for(int j=0;j<m;j++)
            {
                  if(s[i][j]==‘0‘)
                        a[i][j]=0;
                  else if(s[i][j]==‘1‘)
                        a[i][j]=1;
            }
      }
      for(int i=0;i<n;i++)
      {
            for(int j=0;j<m;j++)
            {
                  SPFA(i,j);
                  for(int ii=0;ii<n;ii++)
                  {
                        for(int jj=0;jj<m;jj++)
                        {
                              if(d[ii][jj]<=t)
                                    ans=max(ans,dis(i,j,ii,jj));
                        }
                  }
            }
      }
      printf("%.6lf\n",ans);
      return 0;
}

  

(SPFA) bzoj 1295

标签:

原文地址:http://www.cnblogs.com/a972290869/p/4265210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!