nyoj 38 简单并查集的应用&最小生成树

#include<stdio.h>
#include<stdlib.h>
#define inf  0x3fffffff
#define N 600
struct node {
int x,y,w;
}ma[N*N];
int cmp(const void *a,const void *b) {
return (*(struct node *)a).w-(*(struct node *)b).w;
}
int pre[N];
int find(int x) {
if(x!=pre[x])
    pre[x]=find(pre[x]);
return pre[x];
}
int main() {
   int t,n,m,i,j,k,aa,bb;
   scanf("%d",&t);
   while(t--) {
    scanf("%d%d",&n,&m);
    for(i=0;i<m;i++)
        scanf("%d%d%d",&ma[i].x,&ma[i].y,&ma[i].w);
    qsort(ma,m,sizeof(ma[0]),cmp);
    k=0;
    for(i=1;i<=n;i++)
        pre[i]=i;
    for(i=0;i<m;i++) {
        aa=find(ma[i].x);
        bb=find(ma[i].y);
        if(aa!=bb) {
            pre[aa]=bb;
            k+=ma[i].w;
        }
    }
    j=inf;
    for(i=0;i<n;i++) {
        scanf("%d",&m);
        if(m<j)
            j=m;
    }
    printf("%d\n",j+k);
   }
return 0;
}


posted @ 2014-05-20 19:55  HYDhyd  阅读(137)  评论(0编辑  收藏  举报