最小生成树Prim算法

在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树

Prim算法原理:


  1. 图的所有顶点集合为 V ;初始令集合 u={s},v=Vu ;
  2. 在两个集合 u,v 能够组成的边中,选择一条代价最小的边 (u0,v0) ,加入到最小生成树中,并把 v0 并入到集合u中。
  3. 重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止
实现:
#include<iostream>
#include<queue>
using namespace std;
#define INFINITY 65535
struct MGraph
{
	char V[10];
	int Edge[10][10];
	int Vexnum;
	int Edgenum;
};
void CreateGraph(MGraph *G)  //初始化邻接矩阵
{  
    printf("请输入顶点数和边数:");  
    scanf("%d%d",&(G->Vexnum),&(G->Edgenum));  
    char c;  
    c=getchar();  
    int i,j;  
    for(i=0;i<G->Vexnum;i++)  
        for(j=0;j<G->Vexnum;j++)  
            G->Edge[i][j]=INFINITY;  
  
    printf("请输入顶点信息(char)型\n");  
    for(i=0;i<G->Vexnum;i++)  
        scanf("%c",&(G->V[i]));  
    c=getchar(); 
	
	
    int w;  
    for(int k=0;k<G->Edgenum;k++)  
    {  
        printf("请输入(vi,vj)的下标i,j和权值w:");  
        scanf("%d%d%d",&i,&j,&w);  
        c=getchar();  
        G->Edge[i][j]=w;  
        G->Edge[j][i]=w;  
    } 
  
}  
int min(int a,int b)
{
	return a<b?a:b;
}

int Prim(MGraph *G)
{
	
	int mincost[10];
	bool used[10];
	for(int i=0;i<G->Vexnum;i++)
	{
		used[i]=false;
		mincost[i]=INFINITY;
	}
	mincost[0]=0;
	int res=0;
	printf("依次生成的结点是:\n");
	while(true)
	{
		int v=-1;
		 for(int u=0;u<G->Vexnum;u++)
		 {
			 if(!used[u]&&(v==-1||mincost[u]<mincost[v]))
				 v=u;
		 }
		 if(v==-1)
			 break;
		 used[v]=true;
		 printf("%c",G->V[v]);
		 res+=mincost[v];
		 for(int k=0;k<G->Vexnum;k++)
			 mincost[k]=min(mincost[k],G->Edge[v][k]);
	}
	printf("\n");

	return res;
}

void main()
{
	MGraph G;
	CreateGraph(&G);
	int res=Prim(&G);
	printf("最小路径长度是:");
	printf("%d\n",res);
}
原图:



运行:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值