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 @ 2020-09-29 10:00  姓蜀名黍  阅读(168)  评论(0)    收藏  举报