prim算法模版

#include<iostream>
#define INF 0xffffff
#define M 1000
using namespace std;
double dis[M], map[M][M];
bool flag[M];
int prim(int s, int n)                        //s为起点,n为点的个数
{
	int i, j, k, temp, md, total = 0;
    for(i = 1; i <= n; i++)
		dis[i] = map[s][i];                    //与最短路不同,而是将dis置为map[s][i]
	memset(flag, false, sizeof(flag));
    flag[s] = true;                            //将起点加入集合
    for(i = 1; i < n; i++)
	{                        //依旧进行n-1次迭代,每次找到不在集合的最小边
		md = INF;
        for(j = 1; j <= n; j++) 
		{
			if(!flag[j] && dis[j] < md)
			{
            	md = dis[j];
                temp = j;
            }
        }
		flag[temp] = true;                      //将找到的最小边的点加入集合
        total += md;                            //并将这个边的权值加到total中
        for(j = 1; j <= n; j++)                     //松弛操作,注意与最短路不同
			if(!flag[j] && dis[j] > map[temp][j])
				dis[j] = map[temp][j];
	}
    return total;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值