还是畅通工程(最小生成树入门-Kruskal)

描述

传送门:poj-1875

 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

Input

  • 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
  • 当N为0时,输入结束,该用例不被处理。

Output

对每个测试用例,在1行里输出最小的公路总长度。

Examples

  • intput

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    3
    1 2 1
    1 3 2
    2 3 4
    4
    1 2 1
    1 3 4
    1 4 1
    2 3 3
    2 4 2
    3 4 5
    0
  • output

    1
    2
    3
    5

思路

  • 这是一道简单的最小生成树。
  • Kruskal算法就是在点之间加边,每次在剩下的边中选一条最小边,用这条边将端点的两个点加入生成,并满足这条边的添加不会使生成树产生回路(这条边的两个端点不都在生成树里面)。
  • 用并查集来维护节点是否加入了生成树。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
#define CRL(a) memset(a,0,sizeof(a))
#define MAX 0xfffffff
typedef unsigned long long LL;
typedef long long ll;
const double Pi = acos(-1);
const double e = exp(1.0);
const int mod =1e9+7;

int Father[105];

struct edge //存边
{
int a,b,s;
} Edge[60000];

int Find(int x) //找根节点
{
return Father[x]==x? x:Father[x]=Find(Father[x]);
}

void Union(int a,int b) //合并
{
int fa=Find(a);
int fb=Find(b);
Father[fa]=fb;
}

bool cmp(edge x,edge y)
{
return x.s<y.s;
}

int main()
{
ios::sync_with_stdio(false); //加速

int n=0,ans,add;
while(cin>>n&&n)
{
for(int i=0; i<=n; i++)
Father[i]=i; //初始化
ans=0;
add=0;
for(int i=0; i<n*(n-1)/2; i++)
cin>>Edge[i].a>>Edge[i].b>>Edge[i].s;

sort(Edge,Edge+n*(n-1)/2,cmp); // 按边的权值有小到大排序

for(int i=0; i<n*(n-1)/2&&add<n-1; i++)
if(Find(Edge[i].a)!=Find(Edge[i].b)) //依次添加
{
add++;
ans+=Edge[i].s;
Union(Edge[i].a,Edge[i].b);
}
cout<<ans<<endl;
}

return 0;
}
-------------本文结束 感谢您的阅读-------------

本文标题:还是畅通工程(最小生成树入门-Kruskal)

文章作者:Armin

发布时间:2018年03月28日 - 22:03

最后更新:2018年03月29日 - 00:03

原始链接:http://x-armin.com/还是畅通工程/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

小礼物走一波