| ||||||||||
| 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 | |||||||||
虽然边是按boy-girl输入的,但我们可以把其统一起来,对一类端点加个偏移即可#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_NODE 10005
#define MAX_EDGE 50005
const int Price = 10000;
int N, M, R;
struct Edge{
int x, y, d;
bool operator < (const Edge& other)const{
return d > other.d;
}
} edge[MAX_EDGE];
int father[MAX_NODE * 2];
int Find(int x){
return father[x] != x ? father[x] = Find(father[x]) : x;
}
void build()
{
scanf("%d%d%d", &N, &M, &R);
for(int i = 0; i < R; ++i){
scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].d);
edge[i].y += N;//add a BIAS to girl's id, which is the boy's count
}
}
int kruskal()
{
//initialize
for(int i = M+N-1; i >= 0; --i) father[i] = i;
//sort the edges by descending order
sort(edge, edge + R);
//select, there might be isolate nodes though
int total = 0, k = M+N-1;
for(int i = 0; i < R && k; ++i){
int fx = Find(edge[i].x), fy = Find(edge[i].y);
if(father[fx] != father[fy]){
--k;
total += edge[i].d;
father[fy] = fx;
}
}
return (M+N) * Price - total;
}
int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int test;
for(scanf("%d", &test); test--; ){
build();
printf("%d\n", kruskal());
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator