POJ 3723 Conscription(征兵) 题解 E

复制代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
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) {
            return o.w - this.w;
        }
    }

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

        for (int t = 1; t <= T; t++) {
            st = new StringTokenizer(br.readLine());
            if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            int R = Integer.parseInt(st.nextToken());
            Edge[] edge = new Edge[R];

            for (int i = 0; i < R; i++) {
                st = new StringTokenizer(br.readLine());
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                int d = Integer.parseInt(st.nextToken());

                edge[i] = new Edge(x, N+y, d);
            }

            Arrays.sort(edge);

            int ans = 0;
            init(N+M);

            for (int i = 0; i < R; i++) {
                if(!connector(edge[i].a, edge[i].b)) {
                    join(edge[i].a, edge[i].b);

                    ans += (10000- edge[i].w);
                }
            }

            for (int i = 0; i < N+M; i++) {
                group(i);
            }

            int[] tem = new int[N+M];
            int n = 0;
            for (int i = 0; i < N+M; i++) {
                if(tem[set[i]] == 0) {
                    tem[set[i]] = ++n;
                }
            }

            System.out.println(ans + n * 10000);
        }
    }
}
复制代码

 

posted @   姓蜀名黍  阅读(164)  评论(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编程运行原理
点击右上角即可分享
微信分享提示