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 }
  • 相关阅读:
    RequireJS 和 Sea.js
    zoom:1
    font-sqirrel
    WEB前端面试题 分别使用2个、3个、5个DIV画出一个大的红十字
    获取表单select域的选择部分的文本
    写一个简单的form表单,当光标离开表单的时候表单的值发送给后台
    Python3基础 e记法示例
    Python3基础 response.read 输出网页的源代码
    Python3基础 访问在线的有道词典
    Python3基础 response.info 服务器返回的header信息
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3019839.html
Copyright © 2011-2022 走看看