您的位置:首页 > 其它

最小生成树----Prim算法

2009-07-31 08:33 316 查看
最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图
中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小。



以下代码包含生成无向网图,prim算法计算最小生成树的完整步骤。请观看【动画演示prim算法
】,验证程序是否正确。

代码说明几点:

lowcost[]用来保存集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0表示顶点v已加入最小生成树中;

adjvex[]用来保存依附于该边在集合U中的顶点。

初始无向带权图如下:







实现的完整代码如下:

#include <iostream>
using namespace std;
#define MaxVertexNum 100	//最大的顶点数
#define INF 32767			//将无法到达的权值无限大设为32767
typedef char VertexType;   
typedef int EdgeType;   
typedef struct     
{   
    VertexType vertex[MaxVertexNum];  //顶点表   
    EdgeType edges[MaxVertexNum][MaxVertexNum];     //邻接矩阵,可看做边表   
    int n,e;    //图中当前的顶点数和边数   
}MGraph; 
void CreateMGraph(MGraph &G)   
{   
    int i,j,k,m;   
    cout<<"请输入顶点数和边数:";   
    cin>>G.n>>G.e;   
    cout<<"请输入顶点元素:";   
    for (i=0;i<G.n;i++)   
    {   
        cin>>G.vertex[i];   
    }   
    for (i=0;i<G.n;i++)   
    {   
        for (j=0;j<G.n;j++)   
        {   
            G.edges[i][j]=INF;		//初始化无限大权值
			if (i==j)
			{
				G.edges[i][j]=0;	//对角线为0
			}
        }   
    }   	
    // 无向网图的建立            
	cout<<"请输入边两端顶点序号和相应的权值:/n";   
	for (k=0;k<G.e;k++)   
	{   
		cin>>i>>j>>m;   
		G.edges[i][j]=m;   
		G.edges[j][i]=m;   
	}     
} 
int MinEdge(int lowcost[],int n)
{
	int i,k,min=INF;
	for (i=0;i<n;i++)
	{
		if (lowcost[i]<min && lowcost[i]!=0)
		{
			min=lowcost[i];
			k=i;
		}
	}
	return k;
}
void prim(MGraph G,int lowcost[],char adjvex[])
{
	int i,j,k;
	for(i=1;i<G.n;i++)			//初始化两个辅助数组
	{
		lowcost[i]=G.edges[0][i];
		adjvex[i]=0;
	}
	lowcost[0]=0;				//将顶点0加入集合U中
	for (i=1;i<G.n;i++)
	{
		k=MinEdge(lowcost,G.n);
		cout<<"( "<<(char)(adjvex[k]+'0')<<"--->"<<(char)(k+'0')<<" ) "<<lowcost[k]<<endl;
		lowcost[k]=0;
		for (j=0;j<G.n;j++)				//跟书上的不一样,这里j要从0开始,调整数组lowcost和adjvex
		{
			if (G.edges[k][j]<lowcost[j] && G.edges[k][j]!=0)
			{
				lowcost[j]=G.edges[k][j];
				adjvex[j]=k;
			}
		}
	}
}
int main()
{
	MGraph G;
	int lowcost[25];
	char adjvex[25];
	memset(lowcost,0,sizeof(lowcost));
	memset(adjvex,'/0',sizeof(adjvex));
	CreateMGraph(G);
	prim(G,lowcost,adjvex);
	return 0;
}





程序测试结果如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: