思路
1.将所有边从小到大排序(结构体排序)
2.按从小到大的顺序枚举每条边a,b(权重c),如果当前a,b不连通,就把这条边加入到集合里面中(并查集)
tips:结构体赋值:edges[i] = {a, b, w};
问题
复现时遇到的问题;
1.边数m和点数n不要弄混了噢
2.如果边数小于n-1说明这个树是不连通的,(n是点数)
3.变量在用之前不要忘记了初始化
4.!!!!!
struct edge{
int a,b,w;
}edges[M];
这个你要在上面定义数组的时候,你的最后那个分号千万不要忘记了!!!
5.你的命名不要重复了!!!
6.最后一次错误是你的并查集忘记初始化了!!!你要定要牢牢记住,只要你有用到并查集,你就一定得记得要初始化!!!!
代码
2022.2.23一遍过代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=2e5+10;
struct edge{
int a,b,w;
}edges[M];
bool cmp(edge a,edge b){
return a.w<b.w;
}
int n,m,p[N];
int find(int x){
if(p[x]!=x){
p[x]=find(p[x]);
}
return p[x];
}
int kruskal(){
sort(edges,edges+m,cmp);
for(int i=0;i<=n;i++){
p[i]=i;
}
int cnt=0,res=0;
for(int i=0;i<m;i++){
int a=edges[i].a;
int b=edges[i].b;
int w=edges[i].w;
a=find(a);
b=find(b);
if(a!=b){
p[a]=b;
res+=w;
cnt++;
}
}
if(cnt<n-1){
return -1;
}
return res;
}
int main(){
cin>>n>>m;
int a,b,w;
for(int i=0;i<m;i++){
cin>>a>>b>>w;
edges[i]={a,b,w};
}
int t=kruskal();
if(t==-1){
cout<<"impossible";
}
else cout<<t;
}