| ||||||||||
| 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 | |||||||||
1A#include <stdio.h>
#include <string>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#define inf 0x3f3f3f3f
#define mem0(x , y) memset(x , y , sizeof(x))
#define ll long long
using namespace std;
int sets[30000] ; ///nan + 10000 ;
int find(int x){
return sets[x] == x ? x : sets[x] = find(sets[x]) ;
}
void unionset(int x,int y){
int fx = find(x) ; int fy = find(y) ;
sets[fx] = fy ;
}
struct node{
int s,e ,w;
bool operator < (const node & A)const{
return w < A.w ;
}
}Edge[100000] ;
int main(){
///freopen("1" ,"r" ,stdin) ;
int T ; scanf("%d",&T );
while(T --){
for(int i=0;i<30000;i++) sets[i] = i ;
int n,m,k ;
scanf("%d%d%d",&n,&m,&k) ;
int cnt =0 ;
for(int i=0;i<k;i++){
int ta, tb ,tc;
scanf("%d%d%d",&ta,&tb,&tc) ;
tb += 10000 ;
Edge[cnt].s = ta ; Edge[cnt].e = tb ; Edge[cnt++].w = 10000 - tc ;
}
int ans = 0 ;
int ct = 0 ;
sort(Edge , Edge+cnt) ;
for(int i=0;i<cnt;i++){
int s = Edge[i].s ;int e = Edge[i].e ;
if(find(s) != find(e)){
ans += Edge[i].w ;
ct ++ ;
unionset(s , e) ;
}
}
printf("%d\n",10000*(n+m-ct) + ans) ;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator