zoukankan      html  css  js  c++  java
  • 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

       

    奔跑吧!少年!趁着你还年轻
  • 相关阅读:
    C#/Net代码精简优化技巧(二)【转】
    IsSpecialName特性及其他问题【转】
    &、|与&&、||的比较
    序列化后存储Cookie
    序列化反序列化操作
    C#/Net代码精简优化技巧(一)【转】
    .Net 中的序列化与反序列化【转】
    c#对象序列化(二进制序列化)BinaryFormatter【转】
    POJ 2828 Buy Tickets(单点更新) 详细题解和思路
    Color the ball HDU 1556 (非线段树做法)
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3470272.html
Copyright © 2011-2022 走看看