zoukankan      html  css  js  c++  java
  • 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
    ",cost);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    oracle 将表名和字段名变为大写
    第三方应用软件提权
    数据库提权
    mybatis spring代理开发
    mybatis整合spring原始dao开发
    mybatis和spring整合的jar包准备
    mybatis整合ehcache(分布式缓存框架)
    mybatis 查询缓存
    mybatis 延迟加载
    mybatis 高级映射
  • 原文地址:https://www.cnblogs.com/gdvxfgv/p/5721809.html
Copyright © 2011-2022 走看看