| ||||||||||
| 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 | |||||||||
很兴奋地过掉,突然发觉自己能不用想就打出一个像样的kruskal了#include <iostream>
using namespace std;
const int d = 10001;
struct list{
int v1,v2,w;
};
list v[5 * d];
int vis[2 * d];
int rank[2 * d];
int comp(const void *e1,const void *e2){
return ((list *)e2) -> w - ((list *)e1) -> w;
}
void Init_set(void){
for(int i = 0 ; i <= 20000 ; i ++ ){
rank[i] = 0;
vis[i] = i;
}
return;
}
int Find_set(const int &x){
if(x != vis[x]){
vis[x] = Find_set(vis[x]);
}
return vis[x];
}
bool Union_set(int x,int y){
x = Find_set(x);
y = Find_set(y);
if(x != y){
if(rank[x] > rank[y]){
vis[y] = x;
rank[x] += rank[y];
}
else{
vis[x] = y;
rank[y] += rank[x];
}
return true;
}
return false;
}
int kruskal(int n,int r){
qsort(v,r,sizeof(list),comp);
int result = 0 , count = 0;
for(int i = 0 ; i < r && count < n - 1 ; i ++ ){
if(Union_set(v[i].v1,v[i].v2)){
++ count;
result += v[i].w;
}
}
return result;
}
int main(){
int t,n,m,r;
scanf("%d",&t);
while(t -- ){
scanf("%d%d%d",&n,&m,&r);
for(int i = 0 ; i < r ; i ++ ){
scanf("%d%d%d",&v[i].v1,&v[i].v2,&v[i].w);
v[i].v2 += d;
}
Init_set();
int result = kruskal(n + m,r);
result = 10000 * (n + m) - result;
printf("%d\n",result);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator