• Kruskal HDOJ 1233 还是畅通工程


    题目传送门

     1 /*
     2     最小生成树之kruskal算法--并查集(数据结构)实现
     3     建立一个结构体,记录两点和它们的距离,依照距离升序排序
     4     不连通就累加距离,即为最小生成树的长度
     5 */
     6 #include <cstdio>
     7 #include <algorithm>
     8 #include <cstring>
     9 #include <cmath>
    10 using namespace std;
    11 
    12 const int MAXN = 5e3 + 10;
    13 const int INF = 0x3f3f3f3f;
    14 int rt[MAXN];
    15 struct Node
    16 {
    17     int u, v, w;
    18 }node[MAXN];
    19 
    20 bool cmp(Node x, Node y) {return x.w < y.w;}
    21 
    22 int Find(int x)    {return (rt[x] == -1) ? x : rt[x] = Find (rt[x]);}
    23 
    24 void Union(int x, int y)
    25 {
    26     x = Find (x);    y = Find (y);
    27     if (x > y)    rt[y] = x;
    28     else if (x < y)    rt[x] = y;
    29 }
    30 
    31 bool same(int x, int y)    {return (Find (x) == Find (y));}
    32 
    33 int main(void)        //HDOJ 1233 还是畅通工程
    34 {
    35     //freopen ("inB.txt", "r", stdin);
    36     int n, m;
    37 
    38     while (~scanf ("%d", &n) && n)
    39     {
    40         m = n * (n - 1) / 2;
    41         memset (rt, -1, sizeof (rt));
    42         for (int i=1; i<=m; ++i)
    43         {
    44             scanf ("%d%d%d", &node[i].u, &node[i].v, &node[i].w);
    45         }
    46         sort (node+1, node+1+m, cmp);
    47         int sum = 0;
    48         for (int i=1; i<=m; ++i)
    49         {
    50             int x = node[i].u;    int y = node[i].v;
    51             int w = node[i].w;
    52             if (!same (x, y))    {Union (x, y);    sum += w;}
    53         }
    54         printf ("%d
    ", sum);
    55     }
    56 }
    编译人生,运行世界!
  • 相关阅读:
    鸿合爱学班班.kl课件转ppt课件
    Mac下Android Studio添加忽略文件的方法
    Android中处理PPI
    Mac下配置全局gradlew命令
    Application启动图
    图像合成模式XferMode
    path绘制
    drawArc 画扇形 画弧线
    okhttp请求完整流程图
    责任链模式
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4512994.html
Copyright © 2020-2023  润新知