最小生成树模板
这里使用朴素kruskal算法通过并查集实现
这里我没有使用动态数组进行存图 因为在枚举每条边的时候还有排序的时候会很麻烦
#include<iostream> #include<cstdio> #include<vector> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int father[5001]; int w[5001]; int n,m,ans,tot; int x,y,z; struct edge { int u,to,w; }f[2000001]; int find(int u) { if (father[u]!=u) father[u]=find(father[u]); return father[u]; } int unite(int l,int v) { father[find(l)]=find(v); } int comp(edge a,edge b) { return a.w<b.w; } int main () { cin>>n>>m; for (int i=1;i<=m;i++) { cin>>f[i].u>>f[i].to>>f[i].w; } for (int i=1;i<=n;i++) father[i]=i; sort(f+1,f+m+1,comp); while (tot<n-1) { y++; if (find(f[y].u)!=find(f[y].to)) { ans+=f[y].w; unite(f[y].u,f[y].to); tot++; } } cout<<ans; return 0; }