实验四最小耗费生成树算法的设计与实现.doc
文本预览下载声明
学 生 实 验 报 告
学 院: 软件与通信工程学院
课程名称: 算法分析与设计
专业班级: 软件144班
姓 名: 刘洋
学 号: 0144119
学生实验报告
学生姓名 刘洋 学号 0144119 同组人 实验项目 最小耗费生成树算法的设计与实现 □必修 □选修 □演示性实验 □验证性实验 □操作性实验 □综合性实验 实验地点 G108 实验仪器台号 指导教师 李刚 实验日期及节次 4-89A
一、实验综述
1、实验目的及要求
目的:
实现Prim算法。
要求:
(1)自己生成问题实例;
(2)报告不同算法在实验中的表现。
2、实验仪器、设备或软件
仪器:Windows xp/7/8/10
软件:vs2013
二、实验过程(实验步骤、记录、数据、分析)
生成实例:
对于一个一个带权无向图,给出节点个数以及所有边权值,用Prim算法求最小生成树。
实验代码:
#include stdio.h
#include stdlib.h
#define MAX 100
#define MAXCOST 0x7fffffff
int graph[MAX][MAX];
int Prim(int graph[][MAX], int n)
{
/* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */
int lowcost[MAX];
/* mst[i]记录对应lowcost[i]的起点,当mst[i]=0时表示起点i加入生成树 */
int mst[MAX];
int i, j, min, minid, sum = 0;
/* 默认选择1号节点加入生成树,从2号节点开始初始化 */
for (i = 2; i = n; i++)
{
/* 最短距离初始化为其他节点到1号节点的距离 */
lowcost[i] = graph[1][i];
/* 标记所有节点的起点皆为默认的1号节点 */
mst[i] = 1;
}
/* 标记1号节点加入生成树 */
mst[1] = 0;
/* n个节点至少需要n-1条边构成最小生成树 */
for (i = 2; i = n; i++)
{
min = MAXCOST;
minid = 0;
/* 找满足条件的最小权值边的节点minid */
for (j = 2; j = n; j++)
{
/* 边权值较小且不在生成树中 */
if (lowcost[j] min lowcost[j] != 0)
{
min = lowcost[j];
minid = j;
}
}
/* 输出生成树边的信息:起点,终点,权值 */
printf(%c - %c : %d\n, mst[minid] + A - 1, minid + A - 1, min);
/* 累加权值 */
sum += min;
/* 标记节点minid加入生成树 */
lowcost[minid] = 0;
/* 更新当前节点minid到其他节点的权值 */
for (j = 2; j = n; j++)
{
/* 发现更小的权值 */
if (graph[minid][j] lowcost[j])
{
/* 更新权值信息 */
lowcost[j] = graph[minid][j];
/* 更新最小权值边的起点 */
mst[j] = minid;
}
}
}
/* 返回最小权值和 */
return sum;
}
int main()
{
printf(请输入点数和边数:);
int i, j, k, m, n;
int x, y, cost;
char chx, chy;
scanf(%d%d, m, n);/* 读取节点和边的数目 */
getchar();
printf(请输入边的信息:);
/* 初始化图,所有节点间距离为无穷大 */
for (i = 1; i = m; i++)
{
for (j = 1; j = m; j++)
{
graph[i][j] = MAXCOST;
}
}
/* 读取边信息 */
for (k = 0;
显示全部