题意:求建立QS网络的最小费用。
思路:prim。
代码:
#include <iostream>
#include <climits>
using namespace std;
const int maxn = 1005;
int n;
int edge[maxn][maxn];
int adapter[maxn];
int lowcost[maxn];
void Init(){
cin>>n;
for(int i = 0; i < n; i++)
cin>>adapter[i];
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin>>edge[i][j];
if(i == j) edge[i][j] = INT_MAX;
else edge[i][j] += adapter[i] + adapter[j];
}
}
for(int i = 0; i < n; i++)
lowcost[i] = INT_MAX;
}
int Prim(int u){
int sum = 0;
for(int i = 0; i < n; i++)
lowcost[i] = edge[u][i];
lowcost[u] = -1;
for(int i = 0; i < n-1; i++){
int min = INT_MAX;
int v;
for(int j = 0; j < n; j++){
if(lowcost[j] != -1 && lowcost[j] < min){
v = j; min = lowcost[j];
}
}
sum += min;
lowcost[v] = -1;
for(int j = 0; j < n; j++){
if(edge[v][j] < lowcost[j])
lowcost[j] = edge[v][j];
}
}//end of for
return sum;
}
int main(){
int t;
cin>>t;
while(t--){
Init();
cout<<Prim(0)<<"\n";
}
return 0;
}