最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小。
prim算法要点:设图G =(V,E),其生成树的顶点集合为U。
①、把v0放入U。
②、在所有u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树。
③、把②找到的边的v加入U集合。如果U集合已有n个元素,则结束,否则继续执行②。
其算法的时间复杂度为O(n^2)
代码说明几点:
lowedge[]用来保存集合V-U中各顶点与集合U中顶点最短边的权值,lowedge[v]=0表示顶点v已加入最小生成树中;
midnum[]用来保存依附于该边在集合U中的顶点。
#includeusing namespace std;
#define MaxNum 500
#define INF 99999
typedef int EdgeType;
typedef struct MGraph
{
EdgeType Map[MaxNum][MaxNum];
int num,e;
};
void CreatMGraph(MGraph & G)
{
int i,j,k,n;
cout<<"请输入顶点数与边数:";
cin>>G.num>>G.e;
for(i=0;i< P>
for(j=0;j< P>
{
G.Map[i][j]=INF;
if(i==j)
G.Map[i][j]=0;
}
//无向图的建立
cout<<"请输入两端点的序号和相应的权值:"<< P>
for(k=0;k< P>
{
cin>>i>>j>>n;
G.Map[i][j]=n;
G.Map[j][i]=n;
}
}
int MinEdge(int lowedge[],int n) //找代价最小的边
{
int i,k,min=INF;
for(i=0;i< P>
{
if(lowedge[i]
{
min=lowedge[i];
k=i;
}
}
return k;
}
int prim(MGraph & G,int lowedge[],int midnum[])
{
int i,j,k,begin=0,MSN=0;
for(i=1;i< 初始化辅助数组>
{
lowedge[i]=G.Map[0][i];
midnum[i]=0;
}
lowedge[begin]=0;
for(i=1;i< P>
{
k=MinEdge(lowedge,G.num);
MSN+=lowedge[k];
cout<<"("<<<"->"<<<")"<<
lowedge[k]=0; //第K个顶点并入U
for(j=0;j< P>
{
if(G.Map[k][j]< 新顶点并入U后重新选择最小边>
{
lowedge[j]=G.Map[k][j];
midnum[j]=k;
}
}
}
return MSN;
}
int main()
{
MGraph GM;
int lowedge[MaxNum],midnum[MaxNum];
CreatMGraph(GM);
cout<<
system("pause");
return 0;
}