I - 数据结构实验之图论九:最小生成树
Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个非负整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c(城市编号从1到n)。
Output
每组输出占一行,仅输出最小花费。
Sample
Input
3 2
1 2 1
1 3 1
1 0
Output
2
0
Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个非负整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c(城市编号从1到n)。
Output
每组输出占一行,仅输出最小花费。
Sample
Input
3 2
1 2 1
1 3 1
1 0
Output
2
0
#include <bits/stdc++.h>
using namespace std;
int fa[1005];
struct node
{
int l, r;
int data;
} s[10005];
bool operator<(node a, node b)
{
return a.data < b.data;
}
int Find(int x)
{
if (x == fa[x])
return x;
return fa[x] = Find(fa[x]);
}
int main()
{
int n, m, i, j, ans, a, b;
while (~scanf("%d%d", &n, &m))
{
ans = 0;
j = 0;
for (i = 1; i <= n; i++)
{
fa[i] = i;
}
for (i = 0; i < m; i++)
{
scanf("%d%d%d", &s[i].l, &s[i].r, &s[i].data);
}
sort(s, s + m);
for (i = 0; i < m; i++)
{
a = Find(s[i].l);
b = Find(s[i].r);
if (a != b)
{
ans += s[i].data;
fa[a] = b;
j++;
}
if (j == n - 1) break;
}
printf("%d\n", ans);
}
}