P3723 Conscription java实现,又一道克鲁斯卡尔

题目链接:Comscription

感觉没问题但是不知道为什么会Runtime Error :nu:

-----找了一个多小时,还是不知道输入有什么问题.

还好poj的discuss中有一个java写的代码.

把输入替换了一下就OK了,尴尬.....

:xinsui:但是仍旧不知道为什么读输入会出现Runtime Error,怎么会有错呢.....

老代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
static int[] p;
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 tcase=0;tcase<T;tcase++){
br.readLine();
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken());

        p = new int[N+M+10];
        for(int i = 0;i<N+M+10;i++)
        {
            p[i] = i;
        }
        int g;
        int b;
        int d;
        PriorityQueue<Relation> pq = new PriorityQueue<Relation>();
        for(int i = 0;i<R;i++){
            st = new StringTokenizer(br.readLine());
            g = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken())+N;
            d = Integer.parseInt(st.nextToken());
            pq.add(new Relation(g,b,d));
        }
        Relation pollRelation;
        long value = 0;
        while (!pq.isEmpty()){
            pollRelation = pq.poll();
            if(!connect(pollRelation.x,pollRelation.y)){
                union(pollRelation.x,pollRelation.y);
                value+=pollRelation.d;
            }
        }
        System.out.println(10000*(M+N)-value);
    }
}

private static int find(int a){
    if(p[a] == a){
        return p[a];
    }
    else{
        return p[a] = find(p[a]);
    }
}

private static void union(int a,int b){
    int A = find(a);
    int B = find(b);
    if(A != B){
        p[A] = B;
    }
}

private static boolean connect(int a,int b){
    int A = find(a);
    int B = find(b);
    return A == B;
}

}
class Relation implements Comparable{
int x;
int y;
int d;

public Relation(int x, int y, int d) {
    this.x = x;
    this.y = y;
    this.d = d;
}
@Override
public int compareTo(Relation o) {
    return o.d-this.d;
}

}

AC代码:

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 Main3 {
static int[] p;
static StringTokenizer st;
public static void main(String[] args) throws Exception {
sc.init(System.in );
int T = sc.nextInt();
while (T-- > 0) {
int N = sc.nextInt();
int M = sc.nextInt();
int R = sc.nextInt();

        p = new int[N+M+1];
        for(int i = 0;i<N+M+1;i++)
        {
            p[i] = i;
        }
        int g;
        int b;
        int d;
        int[][] array = new int[R][3];
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < 2; j++) {
                array[i][j] = sc.nextInt();
            }
            array[i][2] = sc.nextInt();
        }
        Arrays.sort(array, new Comparator<int[]>() {
            @Override
            public int compare(int[] ints, int[] t1) {
                return t1[2]-ints[2];
            }
        });
        long value = 0;
        int[] each;
        for(int i = 0;i<array.length;i++){
            each = array[i];
            if(!connect(each[0],each[1]+N)){
                union(each[0],each[1]+N);
                value+=each[2];
            }
        }
        System.out.println(10000*(M+N)-value);
    }
}

private static void union(int a ,int b){
    int A = find(a);
    int B = find(b);
    if(A != B){
        p[A] = B;
    }
}
private static boolean connect(int a,int b){
    int A = find(a);
    int B = find(b);
    return A==B;
}

private static int find(int a){
    if(p[a] == a){
        return p[a];
    }
    else{
        return p[a] = find(p[a]);
    }
}

}
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() );
}
}

posted @ 2021-04-30 16:54  Monstro  阅读(52)  评论(0)    收藏  举报