Aplicación ampliada del árbol de expansión mínimo ------------ nuevo comienzo

Por supuesto, el desarrollo de la industria minera primero debe tener una mina. Little FF gastó una milésima parte de la riqueza obtenida de la última expedición e invitó a alguien a cavar en la isla.

La mía, pero parece haberse olvidado de considerar la fuente de alimentación de la mina. Para garantizar el suministro de electricidad, Little FF pensó en dos formas: en la mina ii

Para construir una central eléctrica a un costo de vivi

(La potencia de salida de la central se puede suministrar a cualquier número de minas). Coloca esta mina II

Con otra mina que ya tiene suministro de electricidad.

Entre el establecimiento de la red eléctrica, el costo es pi, jpi, j

. Little FF quiere que lo ayudes a encontrar una solución de costo mínimo para garantizar el suministro de energía de todas las minas. La primera línea del formato de entrada contiene un número entero nn

, Indicando el número total de minas. Siguiente nn

Filas, un entero por fila, ii

Vivi

Expresado en la sección ii

El costo de construir una central eléctrica en la mina. El siguiente es un n × nn × n

Matriz PP

, Donde pi, jpi, j

Expresado en la sección ii

Mio y jj

El costo de establecer una red eléctrica entre minas. Aseguramiento de datos pi, j = pj, ipi, j = pj, i

, Y pi, i = 0 pi, i = 0

. El formato de salida genera un número entero que representa el costo mínimo para que todas las minas obtengan suficiente energía. Rango de datos 1≤n≤3001≤n≤300

,
0≤vi, pi, j≤1050≤vi, pi, j≤105

Entrada de muestra: 4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
Salida de muestra: 9

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 310;
int dist[N];
int w[N][N];
bool st[N];
int n;
int prim(){
 memset(dist, 0x3f, sizeof dist);
 dist[0] = 0;
  int res = 0;
 for (int i = 0; i < n + 1; i ++){
  int t = -1;
  for (int j = 0; j <= n; j ++)
    if (!st[j] && (t == -1 || dist[j] < dist[t]))
     t = j;
       st[t] = true;
  res += dist[t];
    for (int i = 0; i <= n; i ++)   dist[i] = min(dist[i], w[t][i]);
 }
  return res;
}
int main(){
 scanf("%d", &n);
   for (int i = 1; i <= n; i ++){
     scanf("%d", &w[0][i]);
     w[i][0] = w[0][i];
 }
  for (int i = 1; i <= n; i ++)
    for (int j = 1; j <= n; j ++)
       scanf("%d", &w[i][j]);
        printf("%d\n", prim());
  return 0;
}
164 artículos originales publicados · Me gusta 112 · Visitantes 6775

Supongo que te gusta

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