Árbol de expansión mínimo -------- puntos de cuadrícula conectados

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;
}
164 artículos originales publicados · Me gusta 112 · Visitantes 6776

Supongo que te gusta

Origin blog.csdn.net/qq_45772483/article/details/105410720
Recomendado
Clasificación