题意:这道题题有点坑一开始没看懂什么叫最坏情况。其实就是任意两点之中距离最大的,就是最坏情况。
思路:floyd模版题,ps:竟然这次写跪了然后调试了半天T。T真是忧伤。。。
首先根据给的点建图然后在建图过程中滤去>10的边。然后floyd,接着判断一下连通性,不连通直接输出Send Kurdy。否则输出最大值。
这道题写的有点烦了。。。就不改了直接贴上来了。见谅
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <utility> 8 #include <queue> 9 #include <stack> 10 #include <vector> 11 #define LEN 110 12 #define INF -10001 13 #define eps 1E-10 14 15 using namespace std; 16 17 typedef pair<double, double> pdd; 18 int n ,cnt = 1; 19 pdd p[LEN]; 20 double Map[LEN][LEN], dd[LEN][LEN]; 21 22 inline double dis(pdd a, pdd b){return sqrt((a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second));} 23 int parent[LEN]; 24 void init(){for(int i=0; i<LEN; i++)parent[i] = i;} 25 int Find(int x){return parent[x]==x?x:Find(parent[x]);} 26 void Union(int a, int b){int pa=Find(a), pb=Find(b);if(pa!=pb)parent[pa] = pb;} 27 28 void floyd() 29 { 30 memcpy(dd, Map, sizeof Map); 31 for(int k=1; k<=n; k++){ 32 for(int i=1; i<=n; i++){ 33 for(int j=1; j<=n; j++){ 34 if(dd[i][j]>dd[i][k]+dd[k][j]){ 35 dd[i][j] = dd[i][k]+dd[k][j]; 36 } 37 } 38 } 39 } 40 } 41 42 int main() 43 { 44 // freopen("in.txt", "r", stdin); 45 46 int T; 47 scanf("%d", &T); 48 while(T--){ 49 scanf("%d", &n); 50 for(int i=1; i<=n; i++){ 51 double a, b; 52 scanf("%lf%lf", &a, &b); 53 p[i] = make_pair(a,b); 54 } 55 for(int i=1; i<=n; i++){ 56 for(int j=1; j<=n; j++){ 57 Map[i][j] = dis(p[i],p[j]); 58 if(Map[i][j]>10)Map[i][j] = -INF; 59 } 60 } 61 floyd(); 62 printf("Case #%d: ", cnt++); 63 double ans = INF; 64 for(int i=1; i<=n; i++){ 65 for(int j=1; j<=n; j++){ 66 if(fabs(dd[i][j]+INF)>eps)ans = max(ans, dd[i][j]); 67 } 68 } 69 init(); 70 for(int i=1; i<=n; i++){ 71 for(int j=1; j<=n; j++){ 72 if(dd[i][j]!=-INF)Union(i,j); 73 } 74 } 75 int f=0; 76 for(int i=1; i<=n; i++)if(parent[i]==i)f++; 77 if(f==1)printf("%.4lf ", ans); 78 else printf("Send Kurdy "); 79 } 80 return 0; 81 }