用Prim算法构造最小生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用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;i { lowcost[i]=g.edges[v][i]; closest[i]=v; } for(i=1;i { min=INF; for(j=0;j if(lowcost[j]!=0&&lowcost[j] { min=lowcost[j]; k=j; } printf("边(%d,%d)权为:%d\n",closest[k],k,min); lowcost[k]=0; for(j=0;j if(g.edges[k][j]!=0&&g.edges[k][j] { lowcost[j]=g.edges[k][j]; closest[j]=k; } } } 4、邻接矩阵的创建 void CreatMGraph(MGraph &M) { int n,e; cout<<"输入定点数:"; cin>>n; M.vexnum=n; cout<<"输入弧数:"; cin>>e; M.arcnum=e; for(int i=0;i { for(int j=0;j { if(i==j) M.edges[i][j]=0; else M.edges[i][j]=INF; } } cout<<"输入边的权:(如1 2 3 表示点到点的权时)"< for(int i=0;i<2*e;i++) { int x,y,z; cin>>x>>y>>z; M.edges[x][y]=z; } cout<<"输入点编号,名字:"< for(int i=0;i { int No; string str; cin>>No>>str; M.vexs[i].name=str; M.vexs[i].no=No; } } int const MAXV=16 4、主函数 int main(void) { MGraph m; CreatMGraph(m); cout<<"输出无向图的二维矩阵:"< for(int i=0;i { for(int j=0;j { if(m.edges[i][j]==INF) cout<<" "; else cout< } cout< } cout<<"输入最小生成树:"< prime(m,0); return 0; } 五、实验测试及结果 1.输入图的定点数和边数