| ||||||||||
| 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