最小生成树
使用kruskal算法求解
#include<bits/stdc++.h>
using namespace std;
const int maxn=3005;
int n,m,ans;
struct node{
int u,v,cost;
}E[maxn];
bool cmp(node a, node b){
return a.cost < b.cost;
}
int father[maxn];
void init(){
for(int i=1;i<=n;i++){
father[i]=i;
}
}
int findFather(int x){
if(x==father[x]) return x;
else {
int tmp = findFather(father[x]);
father[x] = tmp;
return tmp;
}
}
void kruskal(){
int sum=0,k=0;
init();
for(int i=0;i<m;i++){
int faA = findFather(E[i].u);
int faB = findFather(E[i].v);
if(faA != faB){
father[faA]=faB;
k++;
sum+=E[i].cost;
}
}
if(k!=n-1) ans=-1;
else ans = sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].cost);
}
sort(E,E+m,cmp);
kruskal();
printf("%d\n",ans);
return 0;
}