原题链接:数据结构-最小生成树
解题思路:
留个笔记,普鲁斯卡尔算法(和本题数据不符)
注意事项:
参考代码:
#include <iostream>
using namespace std;
struct mp{
int x;
int y;
int s;
}e[105];
int note[105];
bool check(int a,int b);
int root(int x);
bool cmp(mp a,mp b);
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>e[i].x>>e[i].y>>e[i].s; //输入数据
}
for(int i=1;i<=n;i++) //初始化
note[i]=i;
sort(e,e+m,cmp);
int sum=0,count=0;//排序
for(int i=0;i<m;i++){ //m条边
if(check(e[i].x,e[i].y)){ //并查集判断是否连通
sum+=e[i].s; //没有连通,权值加起来
count++; //记录数量
cout<<e[i].s<<endl;
}
if(count==n-1) //count为n-1说明 最小生成树已经构建
break;
}
cout<<sum<<endl;
return 0;
}
bool cmp(mp a,mp b){
return a.s<b.s;
}
bool check(int a,int b){
int fx=root(a);
int fy=root(b);
if(fx!=fy){
note[fx]=fy;
return 1;
}
return 0;
}
int root(int x){
int r=x;
while(note[r]!=r){
r=note[r];
}
int j,i=x;
while(i!=r){
j=note[i];
note[i]=r;
i=j;
}
return r;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复