这题没什么好说的,就是个简单的板子题
AC代码:
/*
至少我们现在拥有彼此
*/
#include<bits/stdc++.h>
using namespace std;
const int n=1e6;
int A[n];
int find(int x)//寻找祖宗
{
if(A[x]!=x) A[x]=find(A[x]);
return A[x];
}
struct yqyqyq{//yq!yq我滴神!
int x,y,z;
}B[n];
bool cmp(const yqyqyq&x,const yqyqyq&y)//结构体排序
{
return x.z<y.z;
}
int main()
{
int N,M;
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++) A[i]=i;//初始化父节点
for(int i=1;i<=M;i++)
{
scanf("%d%d%d",&B[i].x,&B[i].y,&B[i].z);
}
sort(B+1,B+M+1,cmp);//排序
// for(int i=1;i<=M;i++) printf("%d %d %d\n",B[i].x,B[i].y,B[i].z);//这是我当时出bug然后调试的
long long sum=0;
int cnt=0;
for(int i=1;i<=M;i++)
{
int a=find(B[i].x);
int b=find(B[i].y);
if(a!=b){
A[b]=a;
sum+=B[i].z;//如果已经连接过(祖宗是同一个就不用再加了)
}
cnt=0;
for(int j=1;j<=N;j++)//判断是否全部连通
{
if(A[j]==j) cnt++;
if(cnt>1) break;
}
if(cnt==1){
printf("%lld\n",sum);
system("pause");//这行是我用vscode防止小黑框一闪而过
return 0;
}
}
printf("orz\n");
// printf("%lld %d\n",cnt,sum);
system("pause");//这行是我用vscode防止小黑框一闪而过
return 0;
}