实验报告
课程名称 《算法分析与设计》 实验日期 2021年3月8日 至 2021年 3 月 15 日
学生姓名 戴子博 所在班级 计算机194 学号 2019212212130
实验名称 构造最小生成树
实验地点 寝室 同组人员
1.问题
采用Prim和Kruskal算法构造最小生成树过程
2.解析
Prim算法:选择一个点为初始顶点,计算所有与之相连接的点的距离,选择距离最短的点并标记,重复以上操作知道所有点都被标记过,最小生成树构造完成
Krusal算法:记录所有边的权值,不断找出权值最小的边加入集合,注意不能让边形成环,出现形成环的情况时跳过加入集合,选择下一条最小的边,直到所有的点都加入到集合后,最小生成树构造完成。
3.设计
Prim算法:
int Prim(int start){
int index=start;
int sum=0;
int i,j;
cout<<start;
bool book[n];
book[start]=true;//标记初始点
for(i=0;i<n;i++)
dist[i]=graph[start][i];//将每个与初始点邻接的点的距离存入dist
for(i=1;i<n;i++){
int min=INF;
for(j=0;j<n;j++){
if(!book[j]&&dist[j]<min){//找到与index相邻的最近的点
min=dist[j];
index=j;
}
}
book[index]=true;//将已经记录的index点标记
cout<<"->"<<index;
sum+=min;//记录总路径
for(j=0;j<n;j++){//重新初始化dist,找到与index邻接的点
if(!book[j]&&dist[j]>graph[index][j])
dist[j]=graph[index][j];
}
}
cout<<endl;
return sum;
}
Kruskal:
int Kruskal(int x){
int sum=0;
make_set();
for(int i=0;i<n;i++){
if(find(node[i].a)!=find(node[i].b)){
Union(node[i].a,node[i].b);
sum+=node[i].l;
}
}
return sum;
}
4.分析
Prim算法:O(n^2)
Kruskal算法:O(n)
5.源码
博客地址:https://blog.csdn.net/shaojinfu?spm=1000.2115.3001.5343
github源码地址:https://github.com/CNFierceman/Algorithm_homework.git