Implementación y recopilación de Hangzhou Electric OJ1232 Smooth Project Java

Recientemente, aprendí el algoritmo de búsqueda de combinación mientras leía "Algoritmo Cuarta Edición" y consolidé mis conocimientos a través de una pregunta. También espero poder ayudar a las personas que escriben esta pregunta.
Enlace de tema

Descripción del Título

Descripción del problema

Una determinada provincia investigó las condiciones del tráfico en ciudades y pueblos y obtuvo una tabla estadística de las carreteras urbanas existentes, que enumera las ciudades y pueblos directamente conectados a cada carretera. El objetivo del "Proyecto desbloqueado" del gobierno provincial es permitir el tráfico entre dos ciudades cualesquiera de la provincia (pero no necesariamente conectadas directamente por carreteras, siempre que se pueda acceder a ellas indirectamente a través de carreteras). Pregunte al menos cuántas carreteras se deben construir.
La entrada de
prueba de entrada contiene varios casos de prueba. La primera línea de cada caso de prueba da dos enteros positivos, que son el número de ciudades N (<1000) y el número de carreteras M; las siguientes líneas M corresponden a M carreteras, y cada línea da un par de enteros positivos, respectivamente El número de dos ciudades conectadas directamente por una carretera. Por simplicidad, las ciudades se numeran del 1 al N.
Nota: Puede haber varias carreteras entre las dos ciudades, lo que significa que la entrada de
3 3
1 2
1 2
2 1
también es legal.
Cuando N es 0, la entrada finaliza y el caso de uso no se procesa.
Salida
Para cada caso de prueba, genere el número mínimo de carreteras que deben construirse en una línea.
Entrada de muestra
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3
5999 0
0
Salida de muestra
1
0
2
998

Código

import java.util.Scanner;

public class Main {
    
    
    static int[] id;
    static int[] sz;

    static int find(int a) {
    
    
        return a == id[a] ? a : find(id[a]);
    }

    static void union(int a, int b) {
    
    
        if (a == b) return;
        int x = find(a), y = find(b);
        if (sz[x] >= sz[y]) {
    
    
            id[y] = x;
            sz[x] += sz[y];
        } else {
    
    
            id[x] = y;
            sz[y] += sz[x];
        }
    }

    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
    
    
            int N = sc.nextInt();
            if (N == 0) break;
            int M = sc.nextInt();
            id = new int[N + 1];
            sz = new int[N + 1];
            for (int i = 0; i < id.length; i++) {
    
    
                id[i] = i;
                sz[i] = 1;
            }
            for (int i = 0; i < M; i++) {
    
    
                int x = sc.nextInt(), y = sc.nextInt();
                union(x, y);
            }

            int count=0;
            for (int i = 1; i <id.length; i++) {
    
    
                if(i==id[i])count++;
            }
            System.out.println(count-1);
        }

    }

}

Supongo que te gusta

Origin blog.csdn.net/ln82799/article/details/109191724
Recomendado
Clasificación