HDU 1233-还是畅通工程

原题链接:点击此处

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

 

posted @ 2016-07-30 21:40  君子酱  阅读(111)  评论(0编辑  收藏  举报