原题链接:数据结构-最小生成树
解题思路:
留个笔记,普鲁斯卡尔算法(和本题数据不符)
注意事项:
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复