POJ2377 Bad Cowtractors 最小生成树

来源:互联网 发布:中国为什么封闭网络 编辑:程序博客网 时间:2024/05/17 06:27

        题目大意是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 QUADMEMSETinline void QuadMemSet(void* dst, int iSize, int value){iSize = iSize / 4;int* newDst = (int*)dst;#ifdef WIN32__asm{mov edi, dstmov ecx, iSizemov eax, valuerep stosd}#elsefor (int i = 0; i < iSize; i++){newDst[i] = value;}#endif}#endifint 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 _DEBUGfreopen("d:\\in.txt", "r", stdin);#endifint 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
原创粉丝点击