既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
三.细节
上述算法主要有两点需要考虑:
- 树的储存
- 集合的表示
树的储存:常见的图储存结构有:邻接矩阵,邻接边表,十字链表,邻接多重表,边集数组 显然,上述算法中频繁涉及到对边的操作,所以边集数组是最佳选择。
集合的表示:使用辅助数组,存放各顶点的根顶点,如果两个顶点的根相同,则属于同一集 合,另则相反。初始化辅助数组元素为-1,代表每个顶点本身就是根节点。
四.实现
#include<iostream>
#define MAX_VEX 10
#define MAX_EDGE 100 //10个顶点组成的无向图最多有100条边
#define TYPE int
using namespace std;
struct Edge //边的属性结构体
{
TYPE start;
TYPE end;
TYPE weight;
};
void ini_gragh(int& vex, int& edge, Edge* gragh);//采用边集数组储存图
void sort_edge(Edge* edges,int edge);//使用冒泡排序,根据权值大小将边从小到大排序
int find_root(int parent[], int n);//寻找根节点以判断是否在一个集合中
int main()
{
int vex; //顶点个数
int edge; //边个数
Edge gragh[MAX_EDGE];
ini_gragh(vex, edge, gragh);//边集数组初始化图
sort_edge(gragh, edge);//依据权值大小给边从小到大排序
int roots[MAX_VEX]; //根数组,存放各顶点的根节点,以区别是否属于同一个集合
Edge MST[MAX_EDGE]; //存放最小生成树(minimum spanning tree)
int count = 0;
for (int i = 0; i < vex; i++)
roots[i] = -1; //初始化root数组,-1代表自己就是根节点;初始状态下每个顶点都是独立的根
for (int i = 0; i < MAX_EDGE; i++)
{
int vex_m = find_root(roots, gragh[i].start);//寻找起点的根节点
int vex_n = find_root(roots, gragh[i].end);//寻找终点的根节点
if (vex_m != vex_n)//如果两者的根节点不同,说明他们属于不同的集合,可以相连
{
MST[count] = gragh[i];//将此边放入MST数组
count++;
roots[vex_m] = vex_n;//将两个树合并,即将顶点vex_n作为vex_m的根节点
}
if (count == vex-1)//当count达到顶点数-1,说明最小树已经生成,退出循环
break;
}
for (int i = 0; i < vex - 1; i++)
{
printf("(%d,%d)%d\n", MST[i].start, MST[i].end, MST[i].weight); //打印最小生成树
}
return 0;
}
void ini_gragh(int& vex, int& edge, Edge* gragh)
{
cout << "输入连通网顶点数:";
cin >> vex;
cout << "输入连通网边数: ";
cin >> edge;
cout << "依次输入各边的起点,终点和权重(空格隔开):" << endl;
for (int i = 0; i < edge; i++)
{
cin >> gragh[i].start >> gragh[i].end >> gragh[i].weight;
}
}
void sort_edge(Edge* edges_arr,int edge)
{
Edge temp;
for (int i = 0; i < edge; i++)
{
for (int k = 0; k < edge - i - 1; k++)//冒泡排序,注意这里要减1
{
if (edges_arr[k].weight > edges_arr[k + 1].weight)
{
temp = edges_arr[k];
edges_arr[k] = edges_arr[k + 1];
edges_arr[k + 1] = temp;
}
}
![img](https://img-blog.csdnimg.cn/img_convert/7808f0cff074936310035ff8206d79d1.png)
![img](https://img-blog.csdnimg.cn/img_convert/647e429058e2461ecf81c24c6b23f71c.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**