conexión a la red UPC-

No importa qué tan alto de la montaña, escalar, subir siempre,
el camino puede ser largo, seguir adelante, será capaz de alcanzar.

puntos de enlace

título Descripción

Hay una matriz de puntos M filas y N columnas, pueden estar conectados a los puntos adyacentes. Una conexión longitudinal lleva una unidad, dos unidades de toma de una conexión lateral. Hay conexiones entre algunos puntos ya, así como al menos preguntan cuántas unidades se necesita para hacer todos los puntos conectados.

entrada

La primera línea de la entrada dos enteros positivos m y n.
Algunos de los siguientes cuatro líneas cada uno números enteros x1 positivo, y1, x2, y2, y2 representa el punto de la primera la segunda líneas de columna x1 x2 y1 línea del punto de columna y tienen conexión. Entrada asegurar | x1-x2 | + | y1 -Y2 | = 1.

exportación

El resto de la comunicación de tal manera que los puntos de salida requieren un costo mínimo.

Ejemplo de entrada

2 2
1 1 2 1

Ejemplo de salida

3

Insinuación

30% de los datos: n-m * <1000 =
100% Datos: m, n <= 1000

Solución a un análisis de problemas
En primer lugar, con una descripción de la misma etapa en la idea de la figura
Aquí Insertar imagen Descripción
primero verticalmente, porque incluso el precio mínimo, es primero verticalmente, incluso si los dos puntos no es un árbol, es decir, la raíz no es lo mismo a continuación, poner los dos enlaces, como se muestra en la figura.
Después de completado hacia abajo vertical, lateral, como se muestra en la imagen, si se encuentra que es una raíz de dos, entonces no está conectada, si no está conectado.

Pero esta es una de dos dimensiones disjuntos conjunto de cómo hacerlo, y de hecho no hay ninguna diferencia entre unidimensional, sólo tenemos que determinar las coordenadas del bien, un poco de hash significa ella.
Así podemos numerar como un ejemplo en esta figura
. 1 2. 4. 3. 5
. 6. 8. 9 10. 7
. 11 14 15 12 es 13 es
16. 17. 19 20 es 18 es
21 es 22 es 23 es 24 25
No estoy de repente se como una grasa 4
Vaya por delante, por lo que podemos AC
Tiempo para AC

PDTenga cuidado de no deriva y no cuentan límites de la matriz de punteros.
Abrir a una serie de al menos 1.001 * 1.001 bar

#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<utility>
#include<stdio.h>
#include<vector>
#include<string>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<deque>
#include<map>
#pragma warning(disable:4244)
#define PI 3.1415926536
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll ll_inf = 9223372036854775807;
const int int_inf = 2147483647;
const short short_inf = 32767;
const char char_inf = 127;
inline ll read() {
    ll c = getchar(), Nig = 1, x = 0;
    while (!isdigit(c) && c != '-')c = getchar();
    if (c == '-')Nig = -1, c = getchar();
    while (isdigit(c))x = ((x << 1) + (x << 3)) + (c ^ '0'), c = getchar();
    return Nig * x;
}
inline void out(ll a)
{
    if (a < 0)putchar('-'), a = -a;
    if (a >= 10)out(a / 10);
    putchar(a % 10 + '0');
}
ll qpow(ll x, ll n, ll mod) {
    ll res = 1;
    while (n > 0) {
        if (n & 1)res = (res * x) % mod;
        x = (x * x) % mod; n >>= 1;
    }
    return res;
}
#define read read()
int fa[1010025];
int find(int x) {
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y) {
    int fx = find(x), fy = find(y);
    if (fx != fy)fa[fx] = fy;
}
int main()
{
    for (int i = 1; i < 1010025; i++)fa[i] = i;
    int x = read, y = read;
    int x1, x2, y1, y2;
    int tot = 0;
    int num1, num2;
    while (scanf("%d%d%d%d", &x1, &y1, &x2, &y2) != EOF)
    {
        num1 = (x1 - 1) * y + y1;
        num2 = (x2 - 1) * y + y2;
        merge(num1, num2);
    }
    for (int j = 1; j <= y; j++)
        for (int i = 1; i < x; i++)
        {
            num1 = (i - 1) * y + j;
            num2 = num1 + y;
            if (find(num1) != find(num2))
            {
                tot++;
                merge(num1, num2);
            }
        }
    for (int i = 1; i <= x; i++)
        for (int j = 1; j < y; j++)
        {
            num1 = (i - 1) * y + j;
            num2 = num1 + 1;
            if (find(num1) != find(num2))
            {
                tot += 2;
                merge(num1, num2);
            }
        }
    cout << tot << endl;
}

Subproducto de la rueda mes

Publicado 32 artículos originales · ganado elogios 11 · vistas 1178

Supongo que te gusta

Origin blog.csdn.net/qq_35339563/article/details/104907584
Recomendado
Clasificación