#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 1e5+5;
struct edge{ //构建边的结构体
int u;
int v;
int w;
edge(int a,int b,int c){
u = a,v=b,w=c;
}
friend bool operator <(const edge&e1,const edge &e2){
return e1.w<e2.w;
}
};
int pre[maxn]; //并查集记录
int n,m;
vector<edge>edges;
int cost = 0;
vector<edge>ST;
int find(int x){
return x==pre[x]? x:pre[x]=find(pre[x]);
}
void kruskal(const vector<edge>&ed){
for(int i = 0;i<ed.size();i++){ //因为是边的权值是从小到大 所以只要动态数组ed中的两个点不在树中 就选择加入这两个点
int fu = find(ed[i].u);
int fv = find(ed[i].v);
if(fu!=fv){
pre[fu]=fv;
cost +=ed[i].w; //更新cost
ST.push_back(ed[i]); //将这个边加入到树中
}
}
}
int main(){
cin>>n>>m;
for(int i = 1;i <= n;i++)
pre[i]=i;
for(int i = 1;i <= m;i++){
int u,v,w;
cin>>u>>v>>w;
edges.push_back(edge(u,v,w)); //将所有的点先加入到动态数组
}
sort(edges.begin(),edges.end()); //将动态数组edges的成员按照 w 的大小 从小到大排序
kruskal(edges); //进行kruskal
cout<<"The cost is:"<<cost<<endl;
cout<<"the kruskal is:"<<endl;
for(int i = 0; i< ST.size(); i++){
cout<<ST[i].u<<" "<<ST[i].v<<" "<<ST[i].w<<endl;
}
最小生成树 kruskal
最新推荐文章于 2022-03-01 21:39:08 发布