Description
给你一个具有n个点,m条边的无向连通图,求其最小生成树的权值和。
Input
第一行两个整数n(1<=n<=300)和m,分别表示图的顶点数和边数。接下来m行是每行三个整数u, v, c,表示结点u和v之间有边相连,权值为c(1≤c≤10000)。
Output
输出文件仅一个整数为最小生成树的权值和。
Sample Input
3 3
1 2 5
2 3 3
1 3 1
Sample Output
4
裸题,模板见代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Edge{
int qs,zz,w;
}E[10000];
int f[10000],ans=0,k=0,n,m;
int find(int x)
{
return x==f[x]?x:f[x]=find(f[x]);
}
void uinon(int x,int y)
{
int p=find(x),q=find(y);
if(p!=q)
{
f[p]=q;
}
}
int cmp(const Edge &x,const Edge &y){
return x.w<y.w;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;++i)
f[i]=i;
for (int i=1;i<=m;++i)
cin>>E[i].qs>>E[i].zz>>E[i].w;
sort(E+1,E+m+1,cmp);
for (int i=1;i<=m;++i)
{
if (find(E[i].qs)!=find(E[i].zz))
{
uinon(E[i].qs,E[i].zz);
ans+=E[i].w;
k++;
}
if (k==n-1)
{
cout<<ans;
return 0;
}
}
}