Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

JAVA, Kruskal, union-find

Posted by SmartChen at 2018-10-28 22:09:42 on Problem 3723
package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main {
    static int[] par;
    static int[] rank;
    public static void main(String[] args) throws IOException {
        sc.init(System.in );
        int T = sc.nextInt();
        while (T-- > 0) {
            int N = sc.nextInt();
            int M = sc.nextInt();
            int R = sc.nextInt();
            int[][] arr = new int[R][3];

            for (int i = 0; i < R; i++) {
                for (int j = 0; j < 2; j++) {
                    arr[i][j] = sc.nextInt();
                }
                arr[i][2] = -sc.nextInt();
            }

            Arrays.sort(arr, new Comparator<int[]>() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    return o1[2] - o2[2];
                }
            });
            long ans = 0;
            par = new int[N + M + 4];
            rank = new int[N + M + 4];
            final int cost = 10000;

            for (int i = 0; i < par.length; i++) {
                par[i] = i;
            }

            //kruskal
            for (int i = 0; i < R; i++) {
                int a = arr[i][0];
                int b = arr[i][1];
                if (same(a, b + N)) continue;
                unite(a, b + N);
                ans += arr[i][2];
            }
            
            System.out.println(ans + (N + M) * cost);
        }
    }
    public static int findp(int x) {
        if (par[x] == x)
            return x;
        return par[x] = findp(par[x]);
        //return findp(par[x]) will make TLE
    }
    public static boolean same(int x, int y) {
        return findp(x) == findp(y);
    }
    public static void unite(int x, int y) {
        x = findp(x);
        y = findp(y);
        if (x == y) return ;
        if (rank[x] < y) {
            par[x] = y;
        }
        else {
            par[y] = x;
            if (rank[x] == rank[y]) rank[x]++;
        }
    }
}
class sc {
    static BufferedReader reader;
    static StringTokenizer tokenizer;
    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) {
        reader = new BufferedReader(
                new InputStreamReader(input) );
        tokenizer = new StringTokenizer("");
    }
    /** get next word */
    static String next() throws IOException {
        while ( ! tokenizer.hasMoreTokens() ) {
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(
                    reader.readLine() );
        }
        return tokenizer.nextToken();
    }
    static int nextInt() throws IOException {
        return Integer.parseInt( next() );
    }
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator