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;
}