最小生成树.docx

上传人:b****4 文档编号:24259915 上传时间:2023-05-25 格式:DOCX 页数:8 大小:298.24KB
下载 相关 举报
最小生成树.docx_第1页
第1页 / 共8页
最小生成树.docx_第2页
第2页 / 共8页
最小生成树.docx_第3页
第3页 / 共8页
最小生成树.docx_第4页
第4页 / 共8页
最小生成树.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

最小生成树.docx

《最小生成树.docx》由会员分享,可在线阅读,更多相关《最小生成树.docx(8页珍藏版)》请在冰豆网上搜索。

最小生成树.docx

最小生成树

实验报告

实验名称

求最小生成树

评分:

实验课时

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;j

if(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;j

if(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;j

if(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;i

for(j=0;j

if(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;i

k=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;i

if(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;i

for(j=0;j

g.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和向同学交流才使实验成功完成。

 

指导老师评议

 

指导老师签名:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 机械仪表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1