zoukankan      html  css  js  c++  java
  • uva 10034(最小生成树)

    记得在哪里做过一遍,最简单的最小生成树,直接用kruskal秒掉了。

    代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <cstring>
     5 #include <cstdlib>
     6 #include <algorithm>
     7 #define LEN 110
     8 using namespace std;
     9 
    10 typedef struct {
    11     double x, y;
    12 }POINT;
    13 
    14 POINT Point[LEN];
    15 
    16 typedef struct {
    17     int a, b;
    18     double w;
    19 }ARC;
    20 
    21 ARC Arc[LEN*LEN];
    22 int top, n;
    23 
    24 inline double dis(POINT a, POINT b){
    25     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    26 }
    27 
    28 //UFSet
    29 int parent[LEN];
    30 
    31 void init(){
    32     for(int i=0; i<LEN; i++)parent[i] = i;
    33 }
    34 
    35 int Find(int x){
    36     return parent[x]==x?x:parent[x]=Find(parent[x]);
    37 }
    38 
    39 void Union(int a, int b){
    40     int pa = Find(a), pb = Find(b);
    41     if(pa!=pb) parent[pa] = pb;
    42 }
    43 
    44 //kurskal
    45 bool cmp(ARC a, ARC b){
    46     return a.w<b.w;
    47 }
    48 
    49 double kurskal()
    50 {
    51     sort(Arc, Arc+top, cmp);
    52     init();
    53     double ret = 0;
    54     int cnt = 0;
    55     for(int i=0; i<top; i++){
    56         if(cnt == n-1) break;
    57         if(Find(Arc[i].a)!=Find(Arc[i].b)){
    58             cnt++;
    59             Union(Arc[i].a, Arc[i].b);
    60             ret+=Arc[i].w;
    61         }
    62     }
    63     return ret;
    64 }
    65 
    66 int main()
    67 {
    68 //    freopen("in.txt", "r", stdin);
    69 
    70     int T;
    71     scanf("%d", &T);
    72     while(T--){
    73         scanf("%d", &n);
    74         for(int i=1; i<=n; i++){
    75             scanf("%lf%lf", &Point[i].x, &Point[i].y);
    76         }
    77         top = 0;
    78         for(int i=1; i<=n; i++){
    79             for(int j=i+1; j<=n; j++){
    80                 Arc[top].a = i;
    81                 Arc[top].b = j;
    82                 Arc[top].w = dis(Point[i],Point[j]);
    83                 top ++;
    84             }
    85         }
    86         double ans = kurskal();
    87         printf("%.2lf
    ", ans);
    88         if(T) printf("
    ");
    89     }
    90     return 0;
    91 }
    View Code
    奔跑吧!少年!趁着你还年轻
  • 相关阅读:
    POJ 3084 Panic Room
    HDU 4111 Alice and Bob
    POJ 2125 Destroying The Graph
    HDU 1517 A Multiplication Game
    Codeforces 258B Little Elephant and Elections
    HDU 2448 Mining Station on the Sea
    ACM MST 畅通工程再续
    ACM DS 畅通工程
    ACM DS 还是畅通工程
    ACM DS Constructing Roads
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3440682.html
Copyright © 2011-2022 走看看