A - la tabla hielo Ray (disjuntos-set)

Descripción

Ray tiene un hábito especial, por lo general, como para recoger todo tipo de cosas extrañas, tales como. . . . Hay. . . . También se incluye. . . . . Ray es un como parte de los zapatos, el Rayo nos dio un conjunto de cosas mágicas, y que es único en el mundo de la mesa de café de hielo! <O: p> </ o : p>
Como el nombre sugiere, la mesa de café se congeló a vivir, lo más importante es que son frágiles, después de todo, que estaba congelado. Así Ray que ser muy cuidadoso de moverlos. Algunos tabla es juntos congelado, de modo que una tabla se divide en varias partes de hielo y se congela si la tabla A y B juntos, B y C están juntos congelado, A y C, entonces se congeló en, es decir, estado de congelación ha pasado sexo, ABC en este momento será considerado como un todo. <O: p> </ o : p>
Para garantizar la integridad de la mesa de café de hielo, un bloque sólo se puede mover la mesa de hielo Ray, que forma parte del conjunto congelado. Ray quiere saber todo lo que necesitaba para mover varias veces para mover el laboratorio, se puede ayudar a Xiaolei calcular rápidamente la respuesta a ella?
entrada

múltiples conjuntos de entradas, el primer número de grupo de entrada T (1 <= T <= 200).
Para cada conjunto de entradas, un primer número entero de entrada n (1 <= n <= 100.000), k (0 <= k <= 100.000), números de la tabla 1 ~ n. <O: P>: </ P O>
línea K después de cada línea dos números x, y (1 <= x , y <= n), representa el x-ésimo e Y-ésima tabla tabla congelado juntos.
salida

Para cada entrada, a la salida "Caso z:" (sin las comillas) representa un grupo y, a continuación, da salida a un entero que representa el número de Ray necesidad de movimiento.
muestra

Entrada

3
3 1
1 2
5 2
1 2
3 4
5 2
1 2
2 3
Output

. 1 Caso: 2
Caso 2 :. 3
. Caso 3 :. 3
requisitos es decir disjuntos-fijó con varios grupos

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int f[100010];
void init(int n)
{
    for(int i=1;i<=n;i++)
        f[i] = i;
}
int getf(int v)
{
    if(f[v] == v)
        return v;
    else
    {
        f[v] = getf(f[v]);
        return f[v];
    }
}
void Merge(int u,int v)
{
    int t1,t2;
    t1 = getf(u);
    t2 = getf(v);
    if(t1 != t2)
    {
        f[t2] = t1;
    }
}
int main()
{
    int t;
    int n,k;
    int u,v;
    scanf("%d",&t);
    for(int p=1;p<=t;p++)
    {
        int cnt = 0;
        scanf("%d %d",&n,&k);
        init(n);
        for(int i=0;i<k;i++)
        {
            scanf("%d %d",&u,&v);
            Merge(u,v);
        }
        for(int i=1;i<=n;i++)
        {
            if(f[i] == i)
                cnt++;
        }
        printf("Case %d: %d\n",p,cnt);
    }
    return 0;

}

Publicados 177 artículos originales · ganado elogios 7 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/Fusheng_Yizhao/article/details/104905245
Recomendado
Clasificación