Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
第一次用krusal算法,尽然出乎我想象的过了,果然比prim 算法好用。谢谢学姐。。。。#include <iostream> #include <algorithm> using namespace std; struct re { int g; int b; int w; }; int n, m, r; re res[100005]; int fa[100005]; bool cmp(re r, re r1) { if (r.w > r1.w) return true; return false; } void init_set(int n) { for (int i = 0; i < n; i++) { fa[i] = -1; } } int find_set(int a) { if (fa[a] < 0) return a; return find_set(fa[a]); } int union_set(int a, int b) { int aa = find_set(a); int bb = find_set(b); if (fa[aa] <= fa[bb]) { fa[aa] += fa[bb]; fa[bb] = aa; } else { fa[bb] += fa[aa]; fa[aa] = bb; } } int main() { //freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout); int cases; scanf("%d", &cases); while (cases--) { scanf("%d%d%d", &n, &m ,&r); for (int i = 0; i < r; i++) { scanf("%d%d%d", &res[i].g, &res[i].b, &res[i].w); res[i].b += n; } //int sum = 0; /*for (int i = 0; i < r; i++) { sum += res[i].w; }*/ //printf("%d\n", (m + n) * 10000 - sum); init_set(n + m); __int64 sum = 0; sort(res, res + r, cmp); for (int i = 0; i < r; i++) { int aa = find_set(res[i].g); int bb = find_set(res[i].b); if (aa != bb) { sum -= res[i].w; union_set(aa, bb); } } printf("%I64d\n", (n + m) * 10000 + sum); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator