就是求任意两点之间最短距离的 最大值 floyd完美解决 自己一个多月没练,手生了,题目也难读懂了!努力吧骚年!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <cstring> #include <cstdio> #include <cmath> using std::min; using std::max; int n; int dx[103][2]; double d[102][102]; double solve(int x, int y) { return sqrt((dx[x][0]-dx[y][0])*(dx[x][0]-dx[y][0])+(dx[x][1]-dx[y][1])*(dx[x][1]-dx[y][1])); } int main() { int t; int cas=0; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(d, 0x7f, sizeof(d)); for(int i=0; i<n; ++i) { scanf("%d %d",&dx[i][0],&dx[i][1]); } double ans=d[0][0]; for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) { double dis=solve(i,j); if(dis<=10.0) d[i][j]=dis; } for(int k=0; k<n; ++k) { for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) { if(d[i][k]<ans && d[k][j]<ans) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } } double mi=0; bool ok=false; for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) { if(d[i][j]<ans) { mi=max(mi,d[i][j]); } else ok=true; } } printf("Case #%d:\n",++cas); if(ok) puts("Send Kurdy"); else printf("%.4lf\n",mi); puts(""); } return 0; }