Árbol de expansión mínimo ----------- enlace

Tyvj tiene un año y el sitio web ha aumentado de los primeros usuarios a decenas de miles de usuarios. Con el crecimiento gradual del sitio web de Tyvj, el número de administradores también está aumentando. Ahora usted es un enlace de la administración de Tyvj, Espero que encuentre algunos canales de comunicación para que el administrador pueda contactarse entre sí (ya sea directa o indirectamente). Los canales de comunicación involucrados en esta pregunta son bidireccionales. Tyvj es un sitio web sin fines de lucro sin ganancias excesivas, por lo que debe mantener los costos lo más bajos posible. En la actualidad, ya sabe que los canales de comunicación de Tyvj se dividen en dos categorías, uno es un canal de comunicación obligatorio, no importa cuánto sea el precio, debe elegirlos todos; el otro es un canal de comunicación selectivo, puede Elija algunos canales de comunicación para contactar como administrador final. Los datos garantizan que el canal de comunicación dado permite que todos los administradores se comuniquen. Nota: para algunos dos administradores u, vu, v

, Puede haber múltiples canales de comunicación entre ellos, su programa debe acumular todo u, vu, v

Debe pasar entre canales. Dos enteros n, mn, m en la primera línea del formato de entrada

Indica que Tyvj tiene un total de nn

Administradores, mm

Canales de comunicación; segunda línea a m + 1m + 1

Filas, cuatro enteros no negativos por fila, p, u, v, wp, u, v, w

Cuando p = 1p = 1

, Indica que este canal de comunicación es un canal de comunicación requerido; cuando p = 2p = 2

, Indica que este canal de comunicación es un canal de comunicación selectivo; u, v, wu, v, w

Indica que este mensaje describe u, vu, v

Canal de comunicación entre administradores, uu

Puede recibir vv

Información, vv

También puede recibir uu

Información, ww

Indica el costo. El formato de salida es un número entero que representa el costo mínimo de comunicación. Rango de datos 1≤n≤20001≤n≤2000

1≤m≤100001≤m≤10000

Entrada de muestra: 5 6
1 1 2 1
1 2 3 1
1 3 4 1
1 4 1 1
2 2 5 10
2 2 5 5
Salida de muestra: 9

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2010, M = 10010;
int n, m;
int p[N];
struct Edge{
 int a, b, w;
 bool operator < (const Edge &t)const{
     return w < t.w; 
 }
}e[M];
int find(int x){
 if (p[x] != x)    p[x] = find(p[x]);
 return p[x];
}
int main(){
 cin >> n >> m;
 for (int i = 1; i <= n; i ++)   p[i] = i;
  int res = 0, k = 0;
 for (int i = 0; i < m; i ++){
  int t, a, b, w;
  cin >> t >> a >> b >> w;
  if (t == 1){
   res  += w;
   p[find(a)] = find(b);
  }
  else    e[k ++] = {a, b, w};
 }
  sort(e, e + k);
  for (int i = 0; i < k; i ++){
  int a = find(e[i].a), b = find(e[i].b);
  if (a != b){
   res += e[i].w;
   p[a] = b;
  }
 }
  cout << res << endl;
  return 0;
}

164 artículos originales publicados · Me gusta 112 · Visitas 6777

Supongo que te gusta

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