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
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