HDOJ 1233:还是畅通工程 普里姆算法求最小生成树

    浙大的考验上机题比较单纯,完全就是考最小生成树算法的。最初想用克鲁斯卡尔算法练练手,没想到这个图是个完全图,克丽丝卡尔算法不适用,于是干脆再写一次普里姆算法得了。

    题目URL:http://acm.hdu.edu.cn/showproblem.php?pid=1233

    我的AC代码:

#include <iostream>
#include <stdio.h>
#include <numeric>
using namespace std;

const int Max = 110;
int g[Max][Max];
int vers;

struct MST
{
	int dist;
	bool belong;
}Mst[Max];

int add(int a, MST &b)
{
	return a + b.dist; 
}

void Prim()
{
	Mst[1].belong = true;

	for(int i=2; i<=vers; ++i)
	{
		Mst[i].dist = g[1][i];
		Mst[i].belong = false;
	}

	for(int i=2; i<=vers; i++)
	{
		int pos = 1;
		while(Mst[pos].belong) ++pos;
		for(int j=pos+1; j<=vers; ++j)
			if(!Mst[j].belong && Mst[j].dist < Mst[pos].dist) 
				pos = j;

		Mst[pos].belong = true;

		for(int j=1; j<=vers; ++j)
			if(!Mst[j].belong && g[pos][j] < Mst[j].dist) 
				Mst[j].dist = g[pos][j];
	}
}

int main()
{
	int head, tail, cost;
	int sum;

	while(scanf("%d", &vers) && vers)
	{
		for(int i=0; i<vers*(vers - 1)/2; ++i)
		{
			scanf("%d%d%d", &head, &tail, &cost);
			g[head][tail] = g[tail][head] = cost;
		}

		Prim();
		sum = accumulate(Mst+1, Mst+vers+1, 0, add);

		printf("%d\n", sum);
	}
	system("pause");
	return 0;
}

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值