最小生成树 maxn和maxm一定要开大鸭鸭鸭鸭
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1100000;
const int MAXM=10000000;
int F[MAXN];
struct Edge{
int u,v,w;
}edge[MAXN];
int tol=0;
void addedge(int u,int v,int w){
edge[tol].u=u;
edge[tol].v=v;
edge[tol++].w=w;
}
bool cmp(Edge a,Edge b){
return a.w<b.w;
}
int find(int x){
if (F[x]==-1) return x;
else return F[x]=find(F[x]);
}
int Kruskal(int n){
memset(F,-1,sizeof(F));
sort(edge,edge+tol,cmp);
//for (int i=0;i<tol;i++)
// printf("edge[i].u=%d edge[i].v=%d edge[i].w=%d\n",edge[i].u,edge[i].v,edge[i].w);
int cnt=0;
int ans=0;
for (int i=0;i<tol;i++){
int u=edge[i].u;
int v=edge[i].v;
int w=edge[i].w;
int t1=find(u); //printf("f[%d]=%d\n",u,t1);
int t2=find(v);//printf("f[%d]=%d\n",v,t2);
if (t1!=t2){
ans+=w;
F[t1]=t2;
cnt++;
// printf("%d\n",cnt);
}
if (cnt==n-1) break;
}
if (cnt<n-1) return -1;
else return ans;
}
int main(){
int n,m;int u,v,w;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
//for (int i=0;i<tol;i++)
//printf("i=%d %d %d e.w=%d\n",i,edge[i].u,edge[i].v,edge[i].w);
int len=Kruskal(n);
printf("%d",len);
return 0;
}