POJ2377 Bad Cowtractors 最小生成树

        题目大意是Bessie被雇佣去搭建一个廉价的网络,给定每条路线间需要的费用,但是他发现雇主想要花费最少的钱去搭建这样的网络,甚至不想付给他报酬。于是

Bessie就打算建造一个最贵的网络(任意两节点都可以互相达到,但是不存在回路)。计算出最多需要花费多少钱。

        这题就是个明显的最小生成树问题,只不过求的是最大费用,所以修改下算法就完全可以。这里用的是Prim算法求的最小生成树。

#ifndef HEAD
#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>

using namespace std;
#endif // !HEAD

#ifndef QUADMEMSET
inline void QuadMemSet(void* dst, int iSize, int value)
{
	iSize = iSize / 4;
	int* newDst = (int*)dst;
#ifdef WIN32
	__asm
	{
		mov edi, dst
			mov ecx, iSize
			mov eax, value
			rep stosd
	}
#else
	for (int i = 0; i < iSize; i++)
	{
		newDst[i] = value;

	}
#endif
}
#endif

int cost[1001][1001];

int prim(int N)
{
	int visited[1001] = { 0 };
	int maxcost[1001];
	//memset(maxcost, 0, sizeof(maxcost));
	memset(visited, 0, sizeof(visited));
	QuadMemSet(maxcost, sizeof(maxcost), -1);
	for (int i = 1; i <= N;i++)
	{
		cost[i][i] = 0;
	}
	maxcost[1] = 0;
	int res = 0;
	
	while (true)
	{
		int v = -1;
		for (int i = 1; i <= N;i++)
		{
			if (!visited[i] && (v == -1 || maxcost[i] > maxcost[v]))
			{
				v = i;
			}
		}
		if (v < 0 || maxcost[v] < 0)
		{
			break;
		}
		visited[v] = 1;
		res += maxcost[v];
		for (int i = 1; i <= N;i++)
		{
			maxcost[i] = std::max(maxcost[i], cost[v][i]);
		}
	}
	for (int i = 1; i <= N;i++)
	{
		if (visited[i] == 0)
		{
			return -1;
		}
	}
	return res;
}

int main()
{
#ifdef _DEBUG
	freopen("d:\\in.txt", "r", stdin);
#endif
	int N, M;
	QuadMemSet(cost, sizeof(cost), -1);
	scanf("%d %d\n", &N, &M);
	for (int i = 0; i < M;i++)
	{
		int a, b, c;
		scanf("%d %d %d\n", &a, &b, &c);
		cost[a][b] = std::max(c, cost[a][b]);
		cost[b][a] = std::max(c, cost[b][a]);
	}
	printf("%d\n", prim(N));
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值