暴力Floyd就行了。。大水题。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //Floyd 5 //水题 6 7 const int maxx = 200; 8 const double Inf = 1e20; 9 double n[maxx][maxx],a[maxx]; //a存的是以a为基准的最远点 10 int d[maxx][2]; 11 double tt = Inf; 12 13 double dis( int i, int j) 14 { 15 return sqrt(pow(d[i][0]-d[j][0],2) + pow(d[i][1]-d[j][1],2)); 16 } 17 18 int main() 19 { 20 // FILE *f = fopen("data.txt","r"); 21 // ifstream inFile; 22 // inFile.open("data2.txt"); 23 int k,i,j,x,y,N,t,num,maxx=0; 24 string s; //输入要处理 25 scanf("%d",&N); 26 // fscanf(f,"%d",&N); 27 for(i=1;i<=N;i++) 28 { 29 scanf("%d%d",&x,&y); 30 // fscanf(f,"%d%d",&x,&y); 31 d[i][0] = x; 32 d[i][1] = y; 33 } 34 for(i=1;i<=N;i++) 35 { 36 cin >> s; 37 // inFile >> s; 38 for(j=0;j<s.size();j++) 39 { 40 t = s[j]-'0'; 41 if(t) n[i][j+1] = n[j+1][i] = dis(i,j+1); 42 else n[i][j+1] = n[j+1][i] = Inf; 43 } 44 } 45 46 for(k=1;k<=N;k++) 47 for(i=1;i<=N;i++) 48 for(j=1;j<=N;j++) 49 if(i!=j ) //这个条件必须 不然就无法确保对角线上为无限 ,确保一次,以后方便w 50 n[i][j] = min(n[i][j],n[i][k]+n[k][j]); 51 52 for(i=1;i<=N;i++) 53 for(j=1;j<=N;j++) 54 if(n[i][j]!=Inf && n[i][j]>a[i] ) a[i] = n[i][j]; 55 56 for(i=1;i<=N;i++) 57 for(j=1;j<=N;j++) 58 if(n[i][j]==Inf && i!=j ) //这个得要,不然对角线上元素又要算进去了。 (我感觉最简单的就是这个条件一直都加上比较好。 59 { 60 n[i][j] = dis(i,j); 61 tt = min(tt,n[i][j] + a[i] + a[j]); //这里求最小 62 } 63 64 // 我也没想到,就是联通不一定是最大的。。。。 65 // 还是不够小心 66 for(i=1;i<=N;i++) 67 if(a[i]>tt) tt = a[i]; //a[i] 已经被确保不等于Inf ,这里比出来最大的。 68 printf("%.6f",tt); 69 return 0; 70 }