美文网首页
UVAlive 6437(最小生成树kruskal)

UVAlive 6437(最小生成树kruskal)

作者: Alan66 | 来源:发表于2017-07-13 23:57 被阅读0次
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    #define MAXN 200000 + 5
    typedef struct Edge
    {
        int u,v,w;
    }edge;
    
    int n,m,i,k;
    edge edges[MAXN];
    int parent[MAXN];
    
    void UFset()
    {
        for(i=0;i<MAXN;i++) parent[i]=i;
    }
    
    int Find(int x)
    {
        if(x==parent[x]) return x;
        else return Find(parent[x]);
    }
    
    void Union(int R1,int R2)
    {
        int r1=Find(R1) ,r2=Find(R2);
        if(r1!=r2) parent[r1]=r2;
        parent[R1]=Find(R1);
        parent[R2]=Find(R2);
    }
    
    bool cmp(edge a,edge b)
    {
        return a.w<b.w;
    }
    
    int main()
    {
        int T,kase=0;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d%d",&n,&m,&k);
            int x1,x2;
            UFset();
            scanf("%d",&x1);
            for(i=1;i<k;i++)
            {
                scanf("%d",&x2);
                Union(x1,x2);
            }
            for(i=0;i<m;i++)
                scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
            sort(edges,edges+m,cmp);
            int sum=0,num=0;
            int u,v;
    
            for(i=0;i<m;i++)
            {
                u=edges[i].u;v=edges[i].v;
                if(Find(u)!=Find(v))
                {
                    sum+=edges[i].w;
                    num++;
                    Union(u,v);
                }
                if(num>=n-1) break;
            }
            printf("Case #%d: %d\n",++kase,sum);
        }
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:UVAlive 6437(最小生成树kruskal)

          本文链接:https://www.haomeiwen.com/subject/nraghxtx.html