最小生成树的Prim算法提高型实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
黄冈师范学院
提高型实验报告
实验课题最小生成树的Prim算法
(实验类型:□综合性■设计性□应用性)
实验课程算法程序设计
实验时间 2010年12月24日
学生姓名周媛鑫
专业班级计科 0801
学号 200826140110
一.实验目的和要求
(1)根据算法设计需要, 掌握连通网的灵活表示方法;
(2)掌握最小生成树的Prim算法;
(3)熟练掌握贪心算法的设计方法;
二.实验条件
(1)硬件环境:实验室电脑一台
(2)软件环境:winTC
三.实验原理分析
(1)最小生成树的定义:
假设一个单位要在n个办公地点之间建立通信网,则连通n个地点只需要n-1条线路。可以用连通的无向网来表示n个地点以及它们之间可能设置的通信线路,其中网的顶点表示城市,边表示两地间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以表示一个通信网。其中一棵使总的耗费最少,即边的权值之和最小的生成树,称为最小生成树。
(2)构造最小生成树可以用多种算法。其中多数算法利用了最小生成树的下面一种简称为MST的性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一棵包含边 (u.v)的最小生成树。
(3)普里姆(Prim)算法即是利用MST性质构造最小生成树的算法。算法思想如下:
假设N=(V,{E})和是连通网,TE是N上最小生成树中边的集合。算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u, v) ∈E 中找一条代价最小的边(u0, v0)并入集合TE,同时v0并入U,直到U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。
四.实验步骤
(1)数据结构的设计:
采用邻接矩阵的存储结构来存储无向带权图更利于实现及操作:
邻接矩阵的抽象数据结构定义:
#define INFINITY INT_MAX //最大值
#define MAX_ERTEX_NUM 20 //最大顶点数
typedef enum {DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向网,无向图} typedef struct Arc Cell{
VRType adj ; // VRType 是顶点关系的类型。对无权图用1和0表示相邻否;InfoType * info; //该弧相关信息的指针
}ArcCell ,AdjMatrix [ MAX_VERTEX_NUM][MAX_VERTEX_NUM];
Typedef struct {
VertexType vexs [ MAX_VERTEX_NUM] ; //顶点向量
AdjMatrix arcs ; // 邻接矩阵
int vexnum , arcnum ; //图的当前顶点数和弧数
GraphKind kind ; // 图的种类标志
}Mgraph ;
(2)函数设计
函数名称函数原型功能描述
main() int main(void) 系统调用主函数
Huiru() void Huitu () 绘制无向图
GraphicVer() void GraphicVer(Graph *G) 输出邻接矩阵
prim() void prim(Graph *G) PRIM算法演示
(3)实验源代码
#include
#include
#include
#include
#include
#define MaxVertexNum 50
#define INF 32767
typedef struct Graphic
{char vexs[MaxVertexNum];
int edges[MaxVertexNum][MaxVertexNum];int v,e;
}Graph;
char tmp[10];
void Huitu() /*无向图的图形生成*/
{char buffer[100];
int graphdriver = DETECT, graphmode;
int i,xbefore,ybefore;
int x1,y1; char c;
/*registerbgidriver(EGAVGA_driver);
initgraph(&graphdriver, &graphmode, ""); cleardevice();
printf("input pot (300 setfillstyle(1,WHITE);setcolor(WHITE); scanf("%d,%d,%s",&xbefore,&ybefore,buffer); circle(xbefore,ybefore,15); floodfill(xbefore,ybefore,WHITE); setcolor(BLUE);outtextxy(xbefore, ybefore, buffer); setcolor(WHITE);moveto(xbefore,ybefore); while(1) {scanf("%d,%d,%s",&x1,&y1,buffer); if(x1==0) break;circle(x1,y1,15); floodfill(x1,y1,WHITE);setcolor(BLUE); outtextxy(x1, y1, buffer);setcolor(WHITE);