题目大意是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;
}