最小生成树(prim算法)

本文介绍Prim算法实现最小生成树的过程,通过邻接矩阵存储图信息,并使用结构体数组记录顶点状态,逐步选择最优边构建最小生成树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:最小生成树(prim算法)

prim算法简单来说就是加点法,如下图所示:



    用邻接矩阵存放整个图的信息(注意无向图的对称性),用一个整型数组on[]来存放已经加入的点,用一个结构体数组存放每个点的信息,包括与之距离最短的点another,两点的权值weigh,以及flag标记是否已被选取。

    先将第一个点放入on[]数组中,每次放入的时候所有未选用的点信息都需要更新(即比较上一次最短距离和与新点之间的距离大小,然后修改weigh和another),然后从中选取weigh最小的点,输出其another与其自身,表示一条新的边,然后将该点存入on[]数组,其flag置为1,重复操作,直到点全部被选完

#include<iostream>
#define MAX 0xfffffff
using namespace std;
typedef struct D
{
	int weigh;//与已有点的最短距离 
	int flag;
	int another;//最近距离的点 
}d;
d dian[100];//存放点的信息
int ok[100];//存放已连接点 
int map[100][100];
char str[100];
int n;
int change(char x)
{
	for(int i=0;i<n;i++)
	{
		if(str[i]==x)
			return i;
	}
}
void find(int j)
{
	for(int i=0;i<n;i++)
	{
		if(dian[i].flag ==1)continue;
		if(dian[i].weigh >map[i][j])
		{
			dian[i].weigh =map[i][j];
			dian[i].another =j;
		}
	}
}
int main()
{
	int e;
	cin>>n>>e;
	for(int i=0;i<n;i++)
		cin>>str[i];
	
	for(int i=0;i<n;i++)
	{
		dian[i].flag =0;
		dian[i].weigh =MAX;
	}	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			map[i][j]=MAX;
	while(e--)
	{
		int w;
		char a,b;
		cin>>a>>b>>w;
		map[change(a)][change(b)]=w;
		map[change(b)][change(a)]=w;
	}		
	ok[0]=0;
	dian[0].flag =1;//已拿 
	int top=0;
	while(top<n)
	{
		find(ok[top]);//更新剩余点信息 
		int min=MAX;
		int p;
		for(int i=0;i<n;i++)
		{
			if(dian[i].flag ==1)continue;
			if(dian[i].weigh <min)
			{
				min=dian[i].weigh ;
				p=i;
			}		
		 }
		 if(top<n-1)cout<<"("<<str[dian[p].another ]<<","<<str[p]<<")";//边比点少一 
		 top++;
		 ok[top]=p;
		 dian[ok[top]].flag =1;		 
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值