zoukankan      html  css  js  c++  java
  • SDUT ACM 2144 最小生成树,克鲁斯卡尔模板 Anti

    图结构练习——最小生成树

    Time Limit: 1000MS    Memory limit: 65536K

    题目描述

     有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
     

    输入

     输入包含多组数据,格式如下。
    第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
    剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
     

    输出

     每组输出占一行,仅输出最小花费。

    示例输入

    3 2
    1 2 1
    1 3 1
    1 0
    

    示例输出

    2
    0
    

     

     1 #include<stdio.h>
     2 #include<algorithm>
     3 struct Edge
     4 {
     5     int u, v, w;
     6 }edge[10010];
     7 
     8 int n, m, set[110];
     9 
    10 int cmp(const struct Edge x, const struct Edge y)
    11 {
    12     return x.w < y.w;
    13 }
    14 
    15 int find(int x)
    16 {
    17     while(x != set[x])
    18         x = set[x];
    19     return x;
    20 }
    21 
    22 int Kruskal()
    23 {
    24     int ans = 0;
    25     for(int i = 1; i <= n; i++)
    26         set[i] = i;
    27     std::sort(edge, edge+m, cmp);
    28     for(int i = 0; i < m; i++)
    29     {
    30         int x = find(edge[i].u);
    31         int y = find(edge[i].v);
    32         if(x != y)
    33         {
    34             ans += edge[i].w;
    35             set[x] = y;
    36         }
    37     }
    38     return ans;
    39 }
    40 
    41 int main()
    42 {
    43     while(~scanf("%d %d", &n, &m))
    44     {
    45         for(int i = 0; i < m; i++)
    46             scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].w);
    47         printf("%d\n", Kruskal());
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    sql优化-mysql的慢查询
    LInux服务器防火墙-开放端口
    vim打开文件中文乱码解决方法总结
    查看指定文件夹或文件总的大小,文件夹下各个文件的大小
    grep -v 反选匹配内容(not操作)以及grep -E(or操作)
    查看Liunx服务器的磁盘使用情况df命令,以及查看磁盘分区lsblk命令
    top发现僵尸进程
    查看linux服务器内存使用情况
    GitHub 和 GitLab对比
    git与svn
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3019839.html
Copyright © 2011-2022 走看看