n个点,m条边
#include<bits/stdc++.h> using namespace std; struct edge{ int sta,ed,val; }a[1000005],b[1000005]; int n,m,tot,f[1000005]; bool mmp(edge a,edge b){ return a.val<b.val; } void add(int sta,int ed,int val){ tot++; b[tot].sta=sta; b[tot].ed=ed; b[tot].val=val; } int find(int x){ if (x==f[x]) return x; f[x]=find(f[x]); return f[x]; } int main(){ scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) f[i]=i; for (int i=1,x,y,z; i<=m; i++){ scanf("%d%d%d",&x,&y,&z); a[i].sta=x; a[i].ed=y; a[i].val=z; } sort(a+1,a+1+m,mmp); for (int i=1,x,y; i<=m; i++){ x=find(a[i].sta); y=find(a[i].ed); if (x!=y){ f[x]=y; add(a[i].sta,a[i].ed,a[i].val); } if (tot==n-1) break; } return 0; }