最小生成树是在n个点的图中选n-1条边构成树(每个点都满足能够互相达到,即直接连接或间接)
整一整kruskal
模板:
#include<bits/stdc++.h> using namespace std; int n,m; int fa[5005]; inline int father(int t){ if(fa[t]!=t) fa[t]=father(fa[t]); return fa[t]; } inline void u(int l,int r){ int fl=father(l); int fr=father(r); if(fl!=fr) fa[fl]=fr; } struct ed{ int len; int begin,end; }dis[200005]; inline bool cmp(ed a,ed b){ return a.len<b.len; } int sum; int num; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); dis[i].begin=x; dis[i].end=y; dis[i].len=z; }sort(dis+1,dis+1+m,cmp); for(int i=1;i<=m;i++){ if(father(dis[i].begin)!=father(dis[i].end)){ u(dis[i].begin,dis[i].end); sum+=dis[i].len; num++; } if(num==n-1){ cout<<sum<<endl; return 0; } } cout<<"orz"; return 0; }