最小生成树普里姆算法c语言代码,普里姆算法生成最小生成树-C语言描述.doc

PAGE

JIN

JINGCHU UNIVERSITY OF TECHNOLOGY

《数据结构(C语言描述)》

课程设计

学 院 计算机工程学院

班 级 12级软件技术1班

学 号 2012304040122、120

124、133、121

2014年 1月3日

目 录

TOC \o "1-3" \h \z \u 1 课程设计介绍 1

1.1 课程设计内容 1

1.2 课程设计要求 1

2 课程设计原理 2

2.1 课设题目粗略分析 2

2.2 原理图介绍 3

2.2.1 功能模块图 3

2.2.2 流程图分析 3

3 数据结构分析 10

3.1 存储结构 10

3.2 算法描述 12

4 调试与分析22

4.1 调试过程22

4.2程序执行过程22

参考文献28

附 录28

第 PAGE 3 页 共 29页

1 课程设计介绍

1.1 课程设计内容

编写算法能够建立带权图,并能够用Prim算法求该图的最小生成树。最小生成树能够选择图上的任意一点做根结点。最小生成树输出采用顶点集合和边的集合的形式。

1.2 课程设计要求

可以输入顶点、边数及各路径的权值;

通过建立无向图或有向图能过输出邻接矩阵或邻接表;

可以输出建立的最小生成树;

画出流程图,且函数有必要说明、注释;

课设完成后上交报告及核心代码。

2 课程设计原理

2.1 课设题目粗略分析

根据课设题目要求,拟将整体程序分为两大模块。以下是两个模块的大体分析:

创建网图并确定网图的存储形式,通过对题目要求的具体分析。发现该题的主要操作是路径的输出,因此采用邻接表和邻接矩阵(起点、终点和权值)两种存储结构,方便以后的编程。

2.Prim算法。设置两个新的集合U和T,其中U用于存放带权图G的最小生成树的结点的集合,T用于存放带权图G的最小生成树边的权值的集合。其思想是:令集合U的初值为U{u0}(即假设构造最小生成树时从结点u0开始),集合T?的初值为T={}。从所有结点u属于U和结点v属于V但不属于U的带权边中选出具有最小权值的边(u,v),将结点v加入集合U中,将边(u,v)加入集合T中。如此不断重复,当U=V时,最小生成树便构造完毕。

2.2 原理图介绍

2.2.1 功能模块图

显示菜单进行选择选择创建(有)无向图及存储方式有向图邻接矩阵无向图邻接矩阵有向图邻接表

显示菜单进行选择

选择创建(有)无向图及存储方式

有向图邻接矩阵

无向图邻接矩阵

有向图邻接表

无向图邻接表

调用普里姆算法输出最小生成树

结束

开始

2.2.2 流程图分析

主函数

开始

开始

显示菜单,选择输入1或2

选择1

选择2

调用createAgraph()函数

结束

选择1

调用CreateGraph()函数

选择2

调用CreateMGraph()函数

调用createALgraph()函数

调用Prim函数,输出最小生成树

图2.2 主函数流程图

2. CreateMGraph()函数

开始

开始

int i,j,k

for(i=0;in;i++)

scanf(“\n%c”,&(G->vexs[i]));

for(i=0;in;i++)

for(j=0;in;i++)

i=j

G->edges[i][j]=0;

Y

N

G->edges[i][j]=max;

for (k=0;ke;k++)

scanf("\n%d,%d,%d",&i,&j,&weight);

G->edges[i][j]=weight;

OutPut(G);

prim(G->edges,G->n,G->vexs);

结束

结束

图2.3 CreateMGraph()函数流程图

3.Prim()函数

开始

开始

int i,j,k,lowcost[100],mincost;

for(i=1;i

{ lowcost[i]=gm[0][i];

closevertex[i]=0; }

set[i]=0;

i=1;

j=1;

Y

Y

lowcost[0]=0;

closevertex[0]=0;

for(i=1;i

mincost=max;

j=1;

k=1;

j

lowcost[j]

mi

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值