Hay un mm
Linea nn
En una matriz de puntos, se pueden conectar dos puntos adyacentes. Una conexión vertical cuesta una unidad y una conexión horizontal cuesta dos unidades. Ya hay una conexión entre algunos puntos. Me gustaría preguntar cuántas unidades se necesitarán al menos para conectar todos los puntos. Ingrese dos enteros positivos mm en la primera línea del formato de entrada
Y nn
. Cada una de las siguientes líneas tiene cuatro enteros positivos x1, y1, x2, y2x1, y1, x2, y2
, Indicando el x1x1
Línea y1y1
Punto de columna y x2x2
Linea y2y2
Los puntos en la columna ya están conectados. Garantía de entrada | x1 − x2 | + | y1 − y2 | = 1 | x1 − x2 | + | y1 − y2 | = 1
. El formato de salida genera el costo mínimo requerido para conectar todos los puntos. Rango de datos 1≤m, n≤10001≤ tiene un mm
Linea nn
En una matriz de puntos, se pueden conectar dos puntos adyacentes. Una conexión vertical cuesta una unidad y una conexión horizontal cuesta dos unidades. Ya hay una conexión entre algunos puntos. Me gustaría preguntar cuántas unidades se necesitarán al menos para conectar todos los puntos. Ingrese dos enteros positivos mm en la primera línea del formato de entrada
Y nn
. Cada una de las siguientes líneas tiene cuatro enteros positivos x1, y1, x2, y2x1, y1, x2, y2
, Indicando el x1x1
Línea y1y1
Punto de columna y x2x2
Linea y2y2
Los puntos en la columna ya están conectados. Garantía de entrada | x1 − x2 | + | y1 − y2 | = 1 | x1 − x2 | + | y1 − y2 | = 1
. El formato de salida genera el costo mínimo requerido para conectar todos los puntos. Rango de datos 1≤m, n≤10001≤m, n≤1000
0≤ número de conexión existente≤100000≤ número de conexión existente≤10000
Muestra de entrada: 2 2
1 1 2 1
Muestra de salida: 3m, n≤1000
0≤ número de
conexión existente≤100000≤ número de conexión existente≤10000
Entrada de muestra: 2 2
1 1 2 1
Salida de muestra: 3 tiene un mm
Linea nn
En una matriz de puntos, se pueden conectar dos puntos adyacentes. Una conexión vertical cuesta una unidad y una conexión horizontal cuesta dos unidades. Ya hay una conexión entre algunos puntos. Me gustaría preguntar cuántas unidades se necesitarán al menos para conectar todos los puntos. Ingrese dos enteros positivos mm en la primera línea del formato de entrada
Y nn
. Cada una de las siguientes líneas tiene cuatro enteros positivos x1, y1, x2, y2x1, y1, x2, y2
, Indicando el x1x1
Línea y1y1
Punto de columna y x2x2
Linea y2y2
Los puntos en la columna ya están conectados. Garantía de entrada | x1 − x2 | + | y1 − y2 | = 1 | x1 − x2 | + | y1 − y2 | = 1
. El formato de salida genera el costo mínimo requerido para conectar todos los puntos. Rango de datos 1≤m, n≤10001≤m, n≤1000
0≤ número de conexión existente≤100000≤ número de conexión existente≤10000
Entrada de muestra: 2 2
1 1 2 1
Salida de muestra: 3
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010, M = N * N, K = 2 * N * N;
int n, m, k;
int ids[N][N];
int p[M];
struct Edge{
int a, b, w;
}e[K];
int find(int x){
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void get_edge(){
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}, dw[4] = {1, 2, 1, 2};
for (int z = 0; z < 2; z ++)
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
for (int u = 0; u < 4; u ++)
if (u % 2 == z){
int x = i + dx[u], y = j + dy[u], w = dw[u];
if (x && x <= n && y && y <= m){
int a = ids[i][j], b = ids[x][y];
if (a < b) e[k ++] = {a, b, w};
}
}
}
int main(){
cin >> n >> m;
for (int i = 1, t = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++, t ++)
ids[i][j] = t;
for (int i = 1; i <= n * m; i ++) p[i] = i;
int x1, y1, x2, y2;
while(cin >> x1 >> y1 >> x2 >> y2){
int a = ids[x1][y1], b = ids[x2][y2];
p[find(a)] = find(b);
}
get_edge();
int res = 0;
for (int i = 0; i < k; i ++){
int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
if (a != b){
p[a] = b;
res += w;
}
}
cout << res << endl;
return 0;
}