POJ 1861 最小生成树D

复制代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    private static int[] set;

    private static void init(int n) {
        set = new int[n];

        for (int i = 0; i < n; i++) {
            set[i] = i;
        }
    }

    private static int group(int n) {
        if(set[n] == n) return set[n];
        return set[n] = group(set[n]);
    }

    private static void join(int a, int b) {
        int A = group(a);
        int B = group(b);

        if(A!=B) {
            set[A] = B;
        }
    }

    private static boolean connector(int a, int b) {
        int A = group(a);
        int B = group(b);

        return A == B;
    }

    static class Edge implements Comparable<Edge> {
        int a;
        int b;
        int w;

        public Edge(int a, int b, int w) {
            this.a = a;
            this.b = b;
            this.w = w;
        }

        @Override
        public int compareTo(Edge o) {
            if(this.w == o.w) {
                if(this.a == o.a) return this.b - o.b;
                return this.a - o.a;
            }
            return this.w - o.w;
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        Edge[] edge = new Edge[M];

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());
            edge[i] = new Edge(a, b, w);
        }

        Arrays.sort(edge);
        int maxlen = -1;
        ArrayList<Edge> arr = new ArrayList();

        init(N+1);
        int eNum = 0;
        for (int i = 0; i < M; i++) {
            if(!connector(edge[i].a, edge[i].b)) {
                eNum++;
                join(edge[i].a, edge[i].b);
                arr.add(edge[i]);
                if(eNum == N-1) {
                    maxlen = edge[i].w;
                    break;
                }
            }
        }

        System.out.println(maxlen);
        System.out.println(arr.size());

        for (int i = 0; i < arr.size(); i++) {
            Edge edg = arr.get(i);
            System.out.println(edg.a+" "+edg.b);
        }
    }
}
复制代码

 

posted @   姓蜀名黍  阅读(161)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示