1295: [SCOI2009]最长距离
Posted inwill
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1295: [SCOI2009]最长距离相关的知识,希望对你有一定的参考价值。
Submit: 1986 Solved: 1094
[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
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
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 。
首先建图,相邻没有障碍的点连边为0,有障碍连边为1
枚举每个点,求到各个点的最短路,若距离小于等于t,则求欧几里得距离(直线距离)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<queue> 6 #include<algorithm> 7 using namespace std; 8 9 const int INF=0x7f7f7f7f; 10 const int xx[4]={-1,1,0,0}; 11 const int yy[4]={0,0,-1,1}; 12 #define ID(x,y) ((x)*m+(y)) 13 #define IDx(i) ((i)/(m)) 14 #define IDy(i) ((i)%(m)) 15 #define sqr(i) ((i)*(i)) 16 17 int n,m,t,ans; 18 int d[1000][1000]; 19 char mp[40][40]; 20 21 struct Edge 22 { 23 int to,w,next; 24 }E[10000]; 25 int node=0,head[1000]; 26 27 void insert(int u,int v,int w) 28 { 29 E[++node]=Edge{v,w,head[u]};head[u]=node; 30 } 31 32 void spfa(int s) 33 { 34 int dist[1000]; 35 bool vis[1000]; 36 memset(dist,0x7f,sizeof(dist)); 37 memset(vis,0,sizeof(vis)); 38 dist[s]=mp[IDx(s)][IDy(s)]-‘0‘; 39 vis[s]=1; 40 queue<int> Q; 41 Q.push(s); 42 while(!Q.empty()) 43 { 44 int q=Q.front();Q.pop(); 45 ans=max(ans,d[s][q]); 46 for(int i=head[q];i;i=E[i].next) 47 if(dist[E[i].to]>dist[q]+E[i].w) 48 { 49 dist[E[i].to]=dist[q]+E[i].w; 50 if(!vis[E[i].to]&&dist[E[i].to]<=t) 51 { 52 Q.push(E[i].to); 53 vis[E[i].to]=1; 54 } 55 } 56 vis[q]=0; 57 } 58 } 59 60 int main() 61 { 62 scanf("%d%d%d",&n,&m,&t); 63 for(int i=0;i<n;i++) 64 scanf("%s",mp[i]); 65 for(int i=0;i<n;i++) 66 for(int j=0;j<m;j++) 67 for(int x=0;x<n;x++) 68 for(int y=0;y<m;y++) 69 d[ID(i,j)][ID(x,y)]=sqr(i-x)+sqr(j-y); 70 for(int i=0;i<n;i++) 71 for(int j=0;j<m;j++) 72 for(int k=0;k<4;k++) 73 { 74 int x=i+xx[k],y=j+yy[k]; 75 if(x<0||y<0||x>=n||y>=m) continue; 76 insert(ID(i,j),ID(x,y),mp[x][y]-‘0‘); 77 } 78 for(int i=0;i<n*m;i++) 79 spfa(i); 80 printf("%.6lf",sqrt(ans)); 81 return 0; 82 }
以上是关于1295: [SCOI2009]最长距离的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路