【bzoj1295】[SCOI2009]最長距離 最短路
阿新 • • 發佈:2019-01-29
貌似不難?列舉兩個點,計算一下兩個點最少去掉多少個方塊,這個最短路就可以做了。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #define inf 1000000000 #define maxn 910 using 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; }