uva 10803(floyd)

题意:这道题题有点坑一开始没看懂什么叫最坏情况。其实就是任意两点之中距离最大的,就是最坏情况。

思路: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 }
View Code

   

奔跑吧!少年!趁着你还年轻
原文地址:https://www.cnblogs.com/shu-xiaohao/p/3470272.html