读书人

hdu 4313 Matrix 并查集 多校联结赛(

发布时间: 2012-09-10 11:02:32 作者: rapoo

hdu 4313 Matrix 并查集 多校联合赛(二) 第四题

这道提问在这哥宫殿里最上的权值和是机器不向联

可以用并查集一做,思想又有点想克鲁斯卡尔,想将所有边从大到小排序,然后加边,让点都指向把机器,如果线的两个点都指向机器了,当然就吧这个边加到sum里,最后sum就是答案啦

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define N 100005struct node{    int x;    int y;    int s;}a[N];bool cmp(node a,node b){    return a.x>b.s;}int vis[N],pa[N];int find(int x){    if(x!=pa[x])        pa[x]=find(pa[x]);    return pa[x];}int main(){//    freopen("in.txt","r",stdin);    int t,x,y,z,n,k,q;    scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&k);        for(int i=0;i<n;i++){            vis[i]=0;            pa[i]=i;        }        for(int i=0;i<n-1;i++)            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].s);        for(int i=0;i<k;i++){            scanf("%d",&q);            vis[q]=1;        }        sort(a,a+n-1,cmp);        long long sum=0;        for(int i=0;i<n-1;i++){            x=find(a[i].x);            y=find(a[i].y); //           cout<<vis[x]<<" "<<vis[y]<<endl;            if(vis[x]&&vis[y])                sum+=a[i].s;            else if(vis[x])                pa[y]=x;            else if(vis[y])                pa[x]=y;            else                pa[x]=y;        }        cout<<sum<<endl;    }}


读书人网 >编程

热点推荐