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

Hay nn en una red de área local

Computadora y kk

Un cable de red de dos vías, el número de la computadora es 1 ~ n1 ~ n

. Debido a la negligencia del personal al configurar la red de área local, las conexiones en la red de área local ahora forman un bucle. Sabemos que si la red de área local forma un bucle, los datos se transmitirán continuamente en el bucle, causando el fenómeno de las tarjetas de red. Nota: Para una conexión, aunque es bidireccional, no la consideramos como un bucle. El circuito descrito en esta pregunta debe contener al menos dos conexiones diferentes. Puede haber como máximo una conexión entre las dos computadoras. No hay una sola conexión, y los dos extremos de la conexión son la misma computadora. Debido a que el cable de red que conecta la computadora es diferente, algunas de las conexiones no son muy suaves, usamos f (i, j) f (i, j)

Mostrar i, ji, j

La suavidad de la conexión entre, f (i, j) f (i, j)

El valor más pequeño significa i, ji, j

Cuanto más suave es la conexión. Ahora tenemos que resolver el problema del bucle, eliminaremos algunas conexiones, para que no haya un bucle en la red y no afecte la conectividad (es decir, si se conectan algunos dos puntos antes, deben conectarse después de ir), y se quita el cable de red Σf (i, j) Σf (i, j)

Máximo, solicite este valor máximo. Dos enteros positivos n, kn, k en la primera línea del formato de entrada

. Siguiente kk

Tres enteros positivos i, j, mi, j, m

Mostrar i, ji, j

Hay una conexión de cable de red entre las dos computadoras, la suavidad es mm

. El formato de salida es un entero positivo, que representa el Σf (i, j) Σf (i, j) del cual se retira el cable de red

El valor máximo. Rango de datos 1≤n≤1001≤n≤100

0≤k≤2000≤k≤200

1≤f (i, j) ≤10001≤f (i, j) ≤1000

Entrada de muestra: 5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
Salida de muestra: 8

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 210;
struct Edge{
 int a, b, w;
 bool operator <(const Edge &t)const{
      return w < t.w;
 }
}e[M];
int p[N];
int n, 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;
  for (int i = 0; i < m; i ++){
  int a, b, c;
  cin >> a >> b >> c;
  e[i] = {a, b, c};
 }
  sort(e, e + m);
  int res = 0;
 for (int i = 0; i < m; i ++){
  int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
  if (a != b)  p[a] = b;
  else         res += w;
 }
  cout << res << endl;
 return 0;
}
164 artículos originales publicados · Me gusta 112 · Visitantes 6781

Supongo que te gusta

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