java模板系列之最小生成树(kruskal)- poj1251

时间复杂度mlogm
值得注意的是,在这个板子里并查集的下标是从0开始的,要是直接用的话,记得改下init把右端点带上

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

import java.util.*;

public class Main {

    static int fa[];
    static int n;
    static v a[];

    static void init(int n){
        for(int i=0;i<n;i++){
            fa[i] = i;
        }
    }

    static int get(int x){
        if(x == fa[x]) return x;
        return fa[x] = get(fa[x]);
    }

    static void merge(int x,int y){
        int newx = get(x);
        int newy = get(y);
        fa[newx] = newy;
    }

    static class v implements Comparable<v>{
        int from;
        int to;
        int val;

        public v(int from, int to, int val) {
            this.from = from;
            this.to = to;
            this.val = val;
        }

        @Override
        public int compareTo(v o) {
            return this.val - o.val;
        }
    }

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        while(input.hasNext()){

            n = input.nextInt();
            //System.out.println(n);
            if(n == 0){
                break;
            }

            fa = new int[n];
            init(n);
            a = new v[n*15+1];
            int ans = 0;
            int tot = 0;

            for(int i=0;i<n-1;i++){
                char c;
                int num;
                c = input.next().charAt(0);

                num = input.nextInt();
                for(int j=0;j<num;j++){
                    char cc;
                    int val;

                    cc = input.next().charAt(0);
                    val = input.nextInt();
                    a[tot++] = new v((int)(c-'A'),(int)(cc-'A'),val);
                }
            }

            Arrays.sort(a,0,tot);

            for(int i=0;i<tot;i++){
                int x = get(a[i].from);
                int y  =get(a[i].to);
                if(x != y){
                    ans += a[i].val;
                    fa[x] = y;
                }
            }

            System.out.println(ans);


        }

    }




}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值