zoukankan      html  css  js  c++  java
  • uva 10397【Connect the Campus】

    Krustral  变形。。。。。。

    代码如下:
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cmath>
     5 
     6 struct distance
     7 {
     8     int u,v;
     9     double w;
    10 }d[1000000];
    11 
    12 struct point
    13 {
    14     int x,y;
    15 }p[1000];
    16 
    17 int f[1000];
    18 int n;
    19 int num;
    20 
    21 bool cmp(const distance& a,const distance& b)
    22 {
    23     if(a.w == b.w)
    24         return a.u < b.u;
    25     return a.w < b.w;
    26 }
    27 
    28 double dis(point a,point b)
    29 {
    30     return sqrt(1.0*(a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y));
    31 }
    32 
    33 int find(int x)
    34 {
    35     if(x == f[x])
    36         return x;
    37     f[x] = find(f[x]);
    38     return f[x];
    39 }
    40 
    41 void Krustral()
    42 {
    43     double sum = 0;
    44     int k = 0;
    45     for(int i = 0;i < num;i ++)
    46     {
    47         int fa = find(d[i].u);
    48         int fb = find(d[i].v);
    49         if(fa != fb)
    50         {
    51             f[fa] = fb;
    52             sum += d[i].w;
    53             k ++;
    54         }
    55         if(k == n -1)
    56             break;
    57     }
    58 
    59     printf("%.2lf\n",sum);
    60 }
    61 
    62 int main()
    63 {
    64     while(scanf("%d",&n) == 1)
    65     {
    66         num = 0;
    67         for(int i = 1;i <= n;i ++)
    68         {
    69             scanf("%d%d",&p[i].x,&p[i].y);
    70             for(int j = 1;j < i;j ++)
    71             {
    72                 d[num].u = i;
    73                 d[num].v = j;
    74 
    75                 d[num ++].w = dis(p[i],p[j]);
    76             }
    77         }
    78 
    79         std::sort(d,d + num,cmp);
    80         for(int i = 0;i <= n;i ++)
    81         {
    82             f[i] =i;
    83         }
    84         int on;
    85         scanf("%d",&on);
    86         for(int i = 0;i < on;i ++)
    87         {
    88             int a,b;
    89             scanf("%d%d",&a,&b);
    90             f[find(a)] = find(b);
    91         }
    92 
    93         Krustral();
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    防抖函数
    video.js汉化
    vscode 设置
    webpack配置
    寄生组合继承
    数组排序
    操作节点的方法
    vscde软件
    vue目录详解
    前端
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2451575.html
Copyright © 2011-2022 走看看