最短路用的是
#include <bits/stdc++.h> using namespace std; #define id(i,j) (i-1)*m+j const int maxn=2e5+10; const int inf=1e9; int a[109][109],n,ju[109][109],vis[maxn],dis[maxn],m; int x[5]={0,0,1,-1},y[5]={1,-1,0,0},T; double ans; struct edge{ int to,nxt,w; }d[maxn]; int head[maxn],cnt=1; void add(int u,int v,int w) { d[++cnt] = (edge){v,head[u],w},head[u] = cnt; } typedef pair<int,int>p; priority_queue<p,vector<p>,greater<p> >q; void dij(int s,int x,int y) { for(int i=1;i<=n*m;i++) dis[i]=inf,vis[i]=0; dis[s]=0; q.push( p(0,s) ); while( !q.empty() ) { int u=q.top().second; q.pop(); for(int i=head[u];i;i=d[i].nxt ) { int v=d[i].to; if( dis[u]+d[i].w<dis[v] ) { dis[v] = dis[u]+d[i].w; if( !vis[v] ) vis[v]=1,q.push( p(dis[v],v) ); } } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if( dis[id(i,j)]+a[x][y]<=T ) { ans = max( ans,sqrt((x-i)*(x-i)*1.0+(y-j)*(y-j)*1.0) ); } } } int main() { cin >> n >> m >> T; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { char ff; cin >> ff; a[i][j] = ff-'0'; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { for(int q=0;q<4;q++) { int nx = i +x[q],ny = j+y[q]; if( nx<1||ny<1||nx>n||ny>n ) continue; add( id(i,j),id(nx,ny),a[nx][ny]==1 ); } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dij( id(i,j),i,j ); printf("%.6lf",ans); }