- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用Prim算法构造最小生成树
用Prim算法构造最小生成树
用Prim算法构造最小生成树
适用标准文案
用 Prim 算法结构最小生成树
班级: 2010 级计算机 1 班 学号: 2010131116 姓名:杨才
一、实验目的
认识最小生成树的观点,掌握生成最小生成树的方法 。
二、实验内容
成立一个含随意结点的无向连通网,并用 Prim 算法结构其最小生成树
三、实验重点及说明
假如无向连通图是一个网, 则其全部生成树中必有一棵树的边的权值总和最小,这棵生成树为最小生成树。
Prim 算法:在图 G=(V,E)(V 为极点集, E 为边集)中任选一极点 v0, 令会合 U={v0} 为初态,在一个极点在 U中,另一极点在 V-U 中的全部边中找权值最小的边( u,v )(U∈ u,v ∈ V-U ),并将 v 加入
到 U中,同时将边( u,v )加入会合 T 中( T 的初态为空集),这样不停地扩大 U,直至 U=V,则会合 T 中的边为所求最小生成树的边
四、算法思想与算法描绘
1、毗邻矩阵的数据种类的定义以下:
typedef struct
{ int no; /* 极点编号 */
string name; /* 极点其余信息 */
} VertexType; /* 极点种类 */
typedef struct /* 图的定义 */
{ int edges[MAXV][MAXV]; /* 毗邻矩阵 */
int vexnum,arcnum; /* 极点数 , 弧数 */
VertexType vexs[MAXV]; /* 寄存极点信息 */
}MGraph;
2、暂时数组的寄存的数据种类
struct {
int closest; // U 集中的极点序号
int lowcost; // 边的权值
} closedge[MAXV];
int const INF=32767; /*INF 表示∞ */
3、prime 算法实现:(原理见实验说明)
void prime(MGraph g, int v)
{
int lowcost[MAXV];
int min;
int closest[MAXV];
int i,j,k;
for (i=0;ig.vexnum;i++)
出色文档
适用标准文案
{
lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for (i=1;ig.vexnum;i++)
{
min=INF;
for (j=0;jg.vexnum;j++)
if (lowcost[j]!=0lowcost[j]min)
{
min=lowcost[j];
k=j;
}
printf( 边 (%d,%d)权为 :%d\n ,closest[k],k,min);
lowcost[k]=0;
for (j=0;jg.vexnum;j++)
if (g.edges[k][j]!=0g.edges[k][j]lowcost[j])
{
lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}
4、毗邻矩阵的创立
void CreatMGraph(MGraph M)
{
int n,e;
cout 输入定点数 : ;
cinn;
M.vexnum=n;
cout 输入弧数 : ;
cine;
M.arcnum=e;
for ( int i=0;in;i++)
{
for ( int j=0;jn;j++)
{
if (i==j)
M.edges[i][j]=0;
else
M.edges[i][j]=INF;
}
}
cout 输入边的权:(如 1 2 3 表示点到点的权时) endl;
出色文档
适用标准文案
for ( int i=0;i2*e;i++)
{
int x,y,z;
cinxyz;
M.edges[x][y]=z;
}
cout 输入点编号,名字: endl;
for ( int i=0;in;i++)
{
int No;
string str;
cinNostr;
M.vexs[i].name=str;
M.vexs[i].no=No;
}
}
int const MAXV=16
4、主函数
int main( void )
{
MGraph m;
CreatMGraph(m);
cout 输出无向图的二维矩阵: endl;
for ( int i=0;im.vexnum;i++)
{
for ( int j=0;jm.vexnum;j++)
{
if (m.edges[i][j]==INF)
cout ;
else
coutm.edges[i][j] ;
}
coutendl;
}
cout 输入
文档评论(0)