I'm still wondering how to find the longest distance ....
Blutrex says the enumeration point pair.
。。。。。 I rub ....
#include <iostream>#include<cstdio>#include<cstring>#include<queue>#include<cmath>#include<algorithm>#defineMAXV 905#defineMaxe 180050#defineINF 0x7f7f7f7fusing namespacestd;intn,m,t,map[ *][ *],dis[ *][ *],ans=0;intdx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};BOOLvis[ *][ *];queue<int>Q;Chars[ +];BOOLJudgeintXinty) { if((x>=1) && (x<=n) && (y>=1) && (y<=m))return true; return false;}BOOLSPFA (intSxintSy) { while(!q.empty ()) Q.pop (); memset (Vis,false,sizeof(VIS)); for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) Dis[i][j]=inf; Q.push (SX); Q.push (SY); Vis[sx][sy]=true;d is[sx][sy]=Map[sx][sy]; while(!Q.empty ()) { intnowx=Q.front (); Q.pop (); intnowy=Q.front (); Q.pop (); Vis[nowx][nowy]=false; for(intI=1; i<=4; i++) { inttx=nowx+dx[i],ty=nowy+Dy[i]; if(judge (Tx,ty)) {if(dis[tx][ty]>dis[nowx][nowy]+Map[tx][ty]) {Dis[tx][ty]=dis[nowx][nowy]+Map[tx][ty]; if(!Vis[tx][ty]) {Vis[tx][ty]=true; Q.push (TX); Q.push (Ty); } } } } } for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) { if(dis[i][j]<=t) ans=max (ans, (I-SX) * (I-SX) + (J-sy) * (J-sy)); }}intMain () {scanf ("%d%d%d",&n,&m,&t); for(intI=1; i<=n;i++) {scanf ("%s", s); for(intj=1; j<=m;j++) Map[i][j]=s[j-1]-'0'; } for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) SPFA (I,J); Doubleanss=sqrt (ans); printf ("%.6lf\n", ANSS); return 0;}
Bzoj 1295 Maximum Distance