题解
2025-11-23 17:19:19
发布于:广东
6阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10;
int fa[N];
int find(int inx){
if(fa[inx]==inx)return inx;
return fa[inx]=find(fa[inx]);
}//并查集
struct Node{
int u,v,w;
//重构小于号
bool operator <(Node node){
return w<node.w;//重构小于号
}
};
// bool cmp();
int main(){
int n,m;
cin>>n>>m;
vector<Node>vec;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
vec.push_back({u,v,w});
}
for(int i=1;i<=n;i++)fa[i]=i;
sort(vec.begin(),vec.end());
int ans=0;
int cnt=0;//统计连通边的数量
for(auto cur:vec){
int u,v,w;
u=cur.u;v=cur.v;w=cur.w;
if(find(u)!=find(v)){//判断u节点是否可以抵达v节点,可抵达
ans+=w;
fa[find(u)]=find(v);//将u,v并入一个集合之中
cnt++;//记录边数
}
}
// cout<<ans<<' '<<cnt<<endl;
if(cnt==n-1){//n-1条边,连接所有节点
cout<<ans<<endl;
}else{
cout<<"orz"<<endl;//否则,不连通
}
}
这里空空如也



有帮助,赞一个