码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1233-还是畅通工程

时间:2016-07-30 22:29:38      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

原题链接:点击此处

1222的升级版,按照费用从低到高排序,然后如果不是在一个集合里就合并,并加上所需的路程,最后所得就是所需的最短路程了。

程序如下:

技术分享
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

struct Tree
{
    int u,v;
    int len;
}tree[5000]; //每条边是一个结构体,u,v分别为边两头的点,len为边的长度

int pre[103];//村庄的个数,节点

void init(int n)
{
    for(int i=1;i<=n;i++)
        pre[i]=i;//初始化 ,一开始每个村庄都是一个单独的集合,编号从1到n
}

bool cmp(Tree a,Tree b)
{
    if(a.len<b.len)
        return true;
    return false;
} //按边的长短从小到大排序

int Find(int x)
{
    return pre[x]==x?x:Find(pre[x]);//找根结点,如2的父节点是3,再找3的父节点是几,直到x的根节点为x为止
}

int main()
{
    int m,n,i;
    while(scanf("%d",&m)&&m)
    {
        int cost=0;
        n=m*(m-1)/2;//边的条数,题目中
        init(m);
        for(i=1;i<=n;i++)
            scanf("%d %d %d",&tree[i].u,&tree[i].v,&tree[i].len);
        sort(tree+1,tree+1+n,cmp);
        for(i=1;i<=n;i++)
        {
            int x=Find(tree[i].u);
            int y=Find(tree[i].v);
            if(x==y)
                continue;
            pre[y]=x;//这里是把x当作了整棵最小生成树的根节点,写成parent[x]=y也可以,根节点换成了y,这里的x,y值都不会大于村庄的编号
            cost+=tree[i].len;
        }
        printf("%d\n",cost);
    }
    return 0;
}
View Code

 

HDU 1233-还是畅通工程

标签:

原文地址:http://www.cnblogs.com/gdvxfgv/p/5721809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!