最小生成树prim(普里姆)算法


#include<stdio.h>
#include<string.h>

#define Max 20
int visited[20];

typedef struct 
{
	char vex[Max];
	int vexs[Max][Max];
	int vexnum,arcnum;
}MGraph;

typedef struct {

	char adjvex;
	int lowcost;

}closest;

int Loca(MGraph &G,char ch)
{
	int i;
	for(i=0;i<G.vexnum;i++)
	{
		if(ch==G.vex[i])
			return i;
	}
		return -1;
}


void Creat_vex(MGraph &G)
{
	int i,j;
	int la1,la2;
	char ch1,ch2;
	int len;
	printf("请输入图的点数以及边数:\n");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	printf("请输入图的点的信息:\n");
	for(i=0;i<G.vexnum;i++)
	{
		getchar();
		scanf("%c",&G.vex[i]);
	}
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
			G.vexs[i][j]=10000;
	printf("请输入个点之间的关系:\n");
	for(i=0;i<G.arcnum;i++)
	{
		getchar();
		scanf("%c %c %d",&ch1,&ch2,&len);
		la1=Loca(G,ch1);	
		la2=Loca(G,ch2);
		G.vexs[la1][la2]=len;
		G.vexs[la2][la1]=G.vexs[la1][la2];
	}
}

void prim(MGraph G,char start)
{
	int i,j,k;
	int ls;
	int min;
	int sum=0;
	ls=Loca(G,start);
	closest C[Max];
	for(i=0;i<G.vexnum;i++)
	{
		if (i!=ls)
		{
			C[i].adjvex=start;
			C[i].lowcost=G.vexs[ls][i];
		}
	
	}
	C[ls].lowcost=0;
	for(i=1;i<G.vexnum;i++)
	{
		min=10000;
		for(j=0;j<G.vexnum;j++)
		{
			if(C[j].lowcost && C[j].lowcost<min)
			{
				k=j;
				min=C[j].lowcost;
			}

		
		}
		printf("到点%c 度为%d    ",C[k].adjvex,k);
		sum+=C[k].lowcost;
		C[k].lowcost=0;
		for(j=0;j<G.arcnum;j++)
		{
			if(G.vexs[k][j]<C[j].lowcost)
			{
				C[j].lowcost=G.vexs[k][j];
				C[j].adjvex=G.vex[k];
			}
		}
		
	}
	putchar('\n');
	printf("最小生成树的度的总和:%d\n",sum);

}
void BFS_Travel(MGraph G)
{
	queue<char>Q;
	int i,j,k;
	char ch;
	for(i=0;i<G.vexnum;i++)
	{
		if(!visited[i])
		{
			visited[i]=1;
			printf("%c ",G.vex[i]);
			Q.push(G.vex[i]);
			while(!Q.empty())
			{
				ch=Q.front();
				Q.pop();
				k=Loca(G,ch);
				for(j=0;j<G.vexnum;j++)
				{
					if(!visited[j]&&G.vexs[k][j])
					{
						visited[j]=1;
						printf("%c ",G.vex[j]);
						Q.push(G.vex[j]);
					}
				}
			}
		}
	}

}

int main()
{
	MGraph G;
	char start;
	Creat_vex(G);
	BFS_Travel(G);
	putchar('\n');
	printf("请输入起始点:");
	getchar();
	scanf("%c",&start);
	prim(G,start);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值