• 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

       

    奔跑吧!少年!趁着你还年轻
  • 相关阅读:
    分享分享JavaScript100例-仅供参考
    为每个页面加上Session判断
    Javascript实现真实字符串剩余字数提示
    格式与文件扩展名指定的格式不一致
    谈谈Github Universe 2019
    合并两个有序链表的golang实现
    二叉搜索树的最近公共祖先的golang实现
    验证二叉搜索树的golang实现
    三数之和的golang实现
    有效的字母异位词的golang实现
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3470272.html
Copyright © 2020-2023  润新知