I - Networking(2017-01-18)

题目大意
这是一道加权并查集的题,题目意思没什么好说的,直接看样例;
样例第一行输入两个数字 n ,m,接下来m行是两点连成的边的权值;
题目要求将1到n的数字联通,并输出最短路径的长度;

思路
开一个结构体数组输入边的信息,并根据边的权值大小从小到大进行排序;
然后依次联通两点,累加边的权值,直到所有点都联通,累加值即为最短路径的长度,输出即可;


#include<stdio.h>
#include<algorithm>
using namespace std;

int n,m;
int pre[10005];

struct edge
{
    int x,y,cost;
}p[55000];

int find(int x)
{
    while(x!=pre[x])
    {
        x=pre[x];
    }
    return x;
}

int mix(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy)
    {
        pre[fx]=fy;
    }
}

bool cmp(edge e1,edge e2)
{
    return e1.cost<e2.cost;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0)break;
        int sum=0;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].cost);
            pre[i]=i;
        }
        sort(p,p+m,cmp);
        for(int i=0;i<m;i++)
        {
            if(find(p[i].x)!=find(p[i].y))
            {
                mix(p[i].x,p[i].y);
                sum+=p[i].cost;
            }
        }
        printf("%d\n",sum);
    }
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,...
    bbqub阅读 581评论 0赞 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 13,082评论 0赞 33
  • 神奇的幻方 题目描述 幻方是一种很神奇的NN矩阵:它由数字1,2,3,……,NN构成,且每行、每列及两条对角线上的...
    bbqub阅读 878评论 0赞 1
  • 站在资本背后的实力是可以修炼的。 首先要突破第一条,投资金额。投入股市的钱并不是越多越好,投资不是要看绝对值,而是...
    遇见橙子阅读 208评论 0赞 1
  • 陈莉莉的工作是急诊室医生…… 三年前因为发现自己快要结婚的男友和自己经常合作的小护士出轨,还搞出一个孩子来。她毅然...
    黛玉李下一段媛阅读 1,083评论 0赞 0

友情链接更多精彩内容