【bzoj1295】[SCOI2009]最长距离 最短路

来源:互联网 发布:c语言教程 编辑:程序博客网 时间:2024/05/19 14:16

貌似不难?枚举两个点,计算一下两个点最少去掉多少个方块,这个最短路就可以做了。


#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define inf 1000000000#define maxn 910using namespace std;int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};int a[31][31];int q1[maxn],q2[maxn],dis[31][31];bool vis[31][31];char s[50];int n,m,T;double ans;void bfs(int x,int y){for (int i=1;i<=n;i++)  for (int j=1;j<=m;j++)    dis[i][j]=inf;int l=0,r=1;q1[1]=x;q2[1]=y;vis[x][y]=1;dis[x][y]=0;while (l!=r){l++;if (l==maxn) l=0;int x=q1[l],y=q2[l];for (int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i];if (xx<1 || xx>n || yy<1 || yy>n) continue;if (dis[x][y]+a[x][y]<dis[xx][yy]){dis[xx][yy]=dis[x][y]+a[x][y];if (!vis[xx][yy]){r++;if (r==maxn) r=0;q1[r]=xx;q2[r]=yy;vis[xx][yy]=1;}}}vis[x][y]=0;}}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++) a[i][j]=s[j]-'0';}ans=0.0;for (int i=1;i<=n;i++)  for (int j=1;j<=m;j++)  {  bfs(i,j);  for (int k=1;k<=n;k++)    for (int p=1;p<=m;p++)      if (dis[k][p]+a[k][p]<=T) ans=max(ans,sqrt((double)(k-i)*(k-i)+(p-j)*(p-j)));  }printf("%.6lf\n",ans);return 0;}


0 0
原创粉丝点击