UVAlive 6437(最小生成树kruskal)

#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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 模板题 . UVA--- 11183传送 还有这道 POJ 3164 点这传送 举个例子:某个图的部分图中, 1...
    Anxdada阅读 3,050评论 1 1
  • 正文之前 在介绍最小生成树之前,需要先介绍一下生成树的概念: 一棵树 T,如果包含一个连通无向图G中的所有顶点,则...
    胖若两人_阅读 8,571评论 0 3
  • 莫涛大神的论文曼哈顿距离最小生成树问题可以简述如下:给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求...
    Gitfan阅读 2,225评论 0 0
  • 加权图是一种为每条边关联一个权值或是成本的图模型。而最小生成树与之密切相关。 定义 图的生成树是它的一棵含有其所有...
    sleepyjoker阅读 1,173评论 0 1
  • 怎会想起幼儿园, 我明明记忆差到滥。 小时候爱唱歌, 于是每个午休都教小朋友唱歌。 小时候爱探险, 于是墙角窥探完...
    _蜜糖_薄荷阅读 243评论 1 2