最小生成树.docx
《最小生成树.docx》由会员分享,可在线阅读,更多相关《最小生成树.docx(8页珍藏版)》请在冰豆网上搜索。
最小生成树
实验报告
实验名称
求最小生成树
评分:
实验课时
4课时
实验地点
致远楼E405
实验时间
2016年3月31日星期四第6周
实验目的
及要求
实验目的:
通过普里姆算法和克鲁斯卡尔算法求最小生成树,进一步熟悉图及其存储结构;掌握普里姆算法和克鲁斯卡尔算法求解最小生成树的思路及过程;掌握图的相关知识点,发现理论学习中的不足,理清学习脉络;能独立思考,并根据要求构造带权无向图,合理运用上述两算法,构造最小生成树。
实验要求:
(1)独立构造一带权无向图(在结论中画出)。
(2)分析该图利用普里姆算法和克鲁斯卡尔算法两种方法得出最小生成树的过程。
(3)编程实现普里姆算法和克鲁斯卡尔算法,并输出上述无向图结果。
实验设备
(软件、硬件及耗材)
软件环境:
vc++6.0win7
硬件环境:
cpu:
i54g内存64位操作系统
实验内容
(算法、程序、步骤、方法及数据记录)
实验内容
(算法、程序、步骤、方法及数据记录)
实验内容
(算法、程序、步骤、方法及数据记录)
实验内容
(算法、程序、步骤、方法及数据记录)
graph.h
#include
typedefintinfotype;
#definemaxv100
#defineinf32737
typedefstruct
{
intno;
infotypeinfo;
}vertextype;//顶点类型
typedefstruct
{
intedges[maxv][maxv];
intn,e;
vertextypevex[maxv];
}mgraph;//图的邻接矩阵类型
//以下定义临接表类型
typedefstructanode
{
intadjvex;
structanode*nextarc;
infotypeinfo;
}arcnode;
typedefintvertex;
typedefstructvnode
{
vertexdata;
arcnode*firstarc;
}vnode;
typedefvnodeAdjlist[maxv];//Adjlist是临接表类型
typedefstruct
{
Adjlistadjlist;
intn,e;
}algraph;
main.cpp
#include"graph.h"
#definemaxe100
typedefstruct
{
intu;//边的起始顶点
intv;//边的终止顶点
intw;//边的权数
}edge;
voiddispmat(mgraphg)//输出邻接矩阵g
{
inti,j;
for(i=0;i{
for(j=0;jif(g.edges[i][j]==inf)
printf("%3s","∞");
else
printf("%3d",g.edges[i][j]);
printf("\n");
}
}
voidprim(mgraphg,intv)//普里姆算法
{
intlowcoast[maxv],min,n=g.n;
intclosest[maxv],i,j,k;
for(i=0;i{
lowcoast[i]=g.edges[v][i];
closest[i]=v;
}
for(i=1;i{
min=inf;
for(j=0;jif(lowcoast[j]!
=0&&lowcoast[j]{
min=lowcoast[j];
k=j;
}
printf("边(%d,%d)权为:
%d\n",closest[k],k,min);
lowcoast[k]=0;
for(j=0;jif(g.edges[k][j]!
=0&&g.edges[k][j]{
lowcoast[j]=g.edges[k][j];
closest[j]=k;
}
}
}
voidsortedge(mgraphg,edgee[])//从邻接矩阵产生权值递增边值
{
inti,j,k=0;
edgetemp;
for(i=0;ifor(j=0;jif(g.edges[i][j]{
e[k].u=i;
e[k].v=j;
e[k].w=g.edges[i][j];
k++;
}
for(i=1;i{
temp=e[i];
j=i-1;
while(j>=0&&temp.w{
e[j+1]=e[j];
j--;
}
e[j+1]=temp;
}
}
voidkruskal(edgeE[],intn,inte)
{
inti,j,m1,m2,sn1,sn2,k;
intvset[maxe];
for(i=0;ik=1;
j=0;
while(k{
m1=E[j].u;m2=E[j].v;
sn1=vset[m1];sn2=vset[m2];
if(sn1!
=sn2)
{
printf("(%d,%d):
%d\n",m1,m2,E[j].w);
k++;
for(i=0;iif(vset[i]==sn2)
vset[i]=sn1;
}
j++;
}
}
voidmain()
{
inti,j,u=3;
mgraphg;
edgeE[maxe];
inta[maxv][maxv]={{0,5,8,7,inf,3},{5,0,4,inf,inf,inf},
{8,4,0,5,inf,9},{7,inf,5,0,5,inf},
{inf,inf,inf,5,0,1},{3,inf,9,inf,1,0}};
g.n=6;g.e=10;
for(i=0;ifor(j=0;jg.edges[i][j]=a[i][j];
sortedge(g,E);
printf("图G的邻接矩阵:
\n");
dispmat(g);
printf("普里姆算法算法求解结果:
\n");
prim(g,0);
printf("克鲁斯卡尔算法算法求解结果:
\n");
kruskal(E,g.n,g.e);
printf("\n");
}
结论
(结果及体会)
一个无向带权图:
结果:
体会:
通过这次实验让我学会了最小二叉树的实现方法,让我了解了自己实验中的不足之处,本实验中的有些地方不是很明白,通过了XX和向同学交流才使实验成功完成。
指导老师评议
指导老师签名:
年月日