实验报告
|
课程名称 |
《算法分析与设计》 |
实验日期 |
2021年3月8日至 2021年 3月 14日 |
||||
|
学生姓名 |
宣鉴超 |
所在班级 |
计算机194 |
学号 |
2019212212152 |
||
|
实验名称 |
举一个实例,画出采用Prim算法构造最小生成树的过程,并按实验报告编写算法 |
||||||
|
实验地点 |
寝室 |
同组人员 |
宣鉴超 |
||||
1. 问题
举一个实例,画出采用Prim算法构造最小生成树的过程。
转化为实际问题就是有n个村庄需要修通道路,已知每两个村庄之间的距离,问怎么修路,使得所有村庄都连通(但不一定有直接的公路相连,只要能间接通过公路到达即可),并且道路总长度最小?请计算最小的公路总长度。
2. 解析
以下为实例
令一张连通图的点集为V,未标记的点集合为V1;V1 = V;
Prim算法的核心思想就是先在V中随意取一个点p并标记p,然后找出与p相连的最短边(是最小生成树的一部分),令这条边的另一个端点为q,我们标记q,然后同理找已经标记的点的未找到的最短边。最后得到的这些边构成了最小生成树。
3. 设计
void MiniSpanTree(MGraph *G)
{
int min, i, j, k;
int adjvex[MaxVex];
int lowcost[MaxVex];
lowcost[0] = 0;
adjvex[0] = 0;
//初始化操作
for (i=1; i<G->numVertexes; ++i)
{
lowcost[i] = G->arc[0][i];
adjvex[i] = 0;
}
for (i=1; i<G->numVertexes; ++i)
{
min = INFINITY;
j = 1;
k = 0;
while (j<G->numVertexes)
{
if (lowcost[j]!=0 && lowcost[j]<min)
{
min = lowcost[j];
k = j;
}
++j;
}
printf("(%d, %d)", adjvex[k], k);
lowcost[k] = 0;
for (j=1; j<G->numVertexes; ++j)
{
if (lowcost[j]!=0 && G->arc[k][j]<lowcost[j])
{
lowcost[j] = G->arc[k][j];
adjvex[j] = k;
}
}
}
}
4. 分析
Prim算法遍历了每一个点,符合条件的点进行判断是否有符合条件的边,其中用优先队列优化了获取最短边的操作,时间复杂度为ELogV,空间复杂度为 n * n。
5. 源码
prim算法:
https://github.com/dingwenjing520/-/blob/main/%E7%AE%97%E6%B3%95%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%AE%9E%E9%AA%8C%EF%BC%88Prim%E7%AE%97%E6%B3%95%EF%BC%89.cpp