最小生成树的Prim算法提高型实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档