POJ
来源:互联网 发布:网络用语咸鱼什么意思 编辑:程序博客网 时间:2024/06/03 19:23
建图,然后,输入的能够节省的钱,变负数存为权值,
首先按每个人都选出来算 ans
然后用克鲁斯卡尔算法求最小生成树
得到的答案就是 最小花费了
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <cmath>#include <set>#include <map>#include <stack>#include <queue>#include <ctype.h>#include <vector>#include <algorithm>#include <sstream>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;const int maxn = 100000 + 7, INF = 0x3f3f3f3f;int n, m, k, ans;int f[maxn];struct edge { int u, v, cost;}a[maxn];bool cmp(edge a, edge b) { return a.cost < b.cost;}void init() { int u, v, e; for(int i = 0; i < k; ++i) { scanf("%d %d %d", &u, &v, &e); a[i].u = u; a[i].v = v+n; a[i].cost = -1*e; } sort(a, a+k, cmp); for(int i = 0; i <= (m+n); ++i) f[i] = i;}int find_(int u) { if(f[u] == u) return u; return f[u] = find_(f[u]);}void kruscal() { for(int i = 0; i < k; ++i) { int u = find_(a[i].u), v = find_(a[i].v), cost = a[i].cost; if(u == v) continue; else { f[u] = v; ans += cost; } }}int main() { int T; scanf("%d", &T); while(T--) { scanf("%d %d %d", &n, &m, &k); init(); ans = (n+m)*10000; kruscal(); printf("%d\n", ans); } return 0;}