CSP_JAKME @ 2024-08-08 14:19:25
#include<bits/stdc++.h>
using namespace std;
struct edge{
int u;
int v;
int w;
};
struct edge e[200001];
int n,m;
int f[200001]={0},sum=0,cnt=0;
void quicksort(int left,int right){
int i,j;
struct edge t;
if(left>right) return;
i=left;
j=right;
while(i!=j){
while(e[j].w>=e[left].w&&i<j) j--;
while(e[i].w<=e[left].w&&i<j) i++;
if(i<j){
t=e[i];
e[i]=e[j];
e[j]=t;
}
}
t=e[left];
e[left]=e[i];
e[i]=t;
quicksort(left,i-1);
quicksort(i+1,right);
return;
}
int getf(int v){
if(f[v]==v) return v;
else{
f[v]=getf(f[v]);
return f[v];
}
}
int merge(int v,int u){
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2){
f[t2]=t1;
return 1;
}
return 0;
}
int main(){
int i;
cin >> n >> m;
for(i=1;i<=m;i++) cin >> e[i].u >> e[i].v >> e[i].w;
quicksort(1,m);
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=m;i++){
if(merge(e[i].u,e[i].v)){
cnt++;
sum+=e[i].w;
}
if(cnt==n-1) break;
}
cout << sum;
return 0;
}
by I_will_AKIOI @ 2024-08-08 14:21:33
没判无解导致的。
by CSP_JAKME @ 2024-08-08 14:22:26
@I_will_AKIOI 怎么判断无解
by lovely_codecat @ 2024-08-08 14:23:50
@CSP_JAKME 用并查集
by xuduang @ 2024-08-08 14:24:14
@CSP_JAKME 最后判一下 cnt==n-1
。
by lovely_codecat @ 2024-08-08 14:25:12
@CSP_JAKME 如果所有节点的祖先一致就有解,否则无解
by CSP_JAKME @ 2024-08-08 14:25:37
@xuduang @lovely_codecat AC