题目大意:有n个点,n*(n-1)/2个边,从这些边里选出一些边,使得整张图变成联通图,同时路径总长度最短,问最短长度
思路:Kruskal模板:先将所有边按照从小到大的顺序排序,然后依次选择边权最小的边,并把边上的两个点放入并查集里,对于即将加入的边,检验它是否在并查集里,如果这边的两个点已经在同一个并查集里,舍弃这条边
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 105;
int n;
struct Edge
{
int u, v, w;
bool operator<(const Edge& a)const
{
return w < a.w;
}
}e[N * N];
int fa[N];
int find(int x)
{
return fa[x] == x ? x : find(fa[x]);
}
int kruskal()
{
int ans = 0;
int m = n * (n - 1) / 2;
for (int i = 1; i <= n; i++)
{
fa[i] = i;
}
sort(e + 1, e + 1 + m);
for (int i = 1; i <= m; i++)
{
int b = find(e[i].u);
int c = find(e[i].v);
if (b == c)
continue;
fa[c] = b;
ans += e[i].w;
}
return ans;
}
int main()
{
while (~scanf("%d", &n) && n)
{
for (int i = 1; i <= n * (n - 1) / 2; i++)
{
int u, v, w;
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
}
printf("%d\n", kruskal());
}
return 0;
}