kruskal算法的流程是将所有边保存下来并按照边权排序,借助并查集每次取出最小的边,然后询问这条边的两个端点是否已经联通,如果未联通那这条边就是最小生成树的一条边。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110,M=210;
int p[N];
int n,m;
struct edge{
int a,b,w;
bool operator< (const edge &t) const{
return w<t.w;
}
}e[M];
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int kruskal(){
int res=0;
for(int i=0;i<m;i++){
int a=find(e[i].a),b=find(e[i].b),w=e[i].w;
if(a!=b) {
res+=w;
p[a]=b;
}
}
return res;
}
int main(){
cin>>n>>m;
int tot=0;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=0;i<m;i++){
int a,b,w;
cin>>a>>b>>w;
e[i]={a,b,w};
tot+=w;
}
sort(e,e+m);
int t=kruskal();
cout<<tot-t;
return 0;
}