http://poj.org/problem?id=2377
题意:现在有一个人给人修建一些线路,(当然,我们想要少花钱消费,人家就想多多赚你的钱了,现在就给出这么一个问题)。让你求修得所有电路能赚取的最大利润,若电路不能被全部修完,输出“-1”.
分析:最小生成树模板改一改就好啦~
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; #define maxn 1100 #define oo 0x3f3f3f3f int maps[maxn][maxn], dist[maxn], v[maxn]; int n, m; int Prim() { memset(v, 0, sizeof(v)); for(int i=1; i<=n; i++) dist[i] = maps[1][i]; v[1] = 1; int sum = 0; for(int i=1; i<n; i++) { int index = -1, mins=-oo; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]>mins) { mins = dist[j]; index = j; } } if(mins == -1) return -1; sum += mins; v[index] = 1; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]<maps[index][j]) dist[j]=maps[index][j]; } } return sum; } int main() { int a, b, c; scanf("%d %d", &n, &m); memset(maps, -1, sizeof(maps)); for(int i=1; i<=m; i++) { scanf("%d %d %d", &a, &b, &c); maps[a][b] = maps[b][a] =max(maps[a][b], c); } int ans; ans = Prim(); printf("%d ", ans); return 0; }