zoj 1586 最小生成树prim水题
/* 题意:QS之间互相通信分别需要一定价钱的cable以及QS与每个其它QS相连都需要一个adapter,每个QS都有自己 喜欢的adapter(即第i个QS用固定价格的adapter),给出n个adapter的价格以及n*n的矩阵(表示i,j连接的cable 的价格),求最少用多少钱; 题解:模板水题,最小生成树prim 在输入n*n的矩阵时顺便把adapter的费用也加入边中,每条边相连需要两个adapter */ #include <iostream> #include <cstring> using namespace std; #define VERMAX 1005 int map[VERMAX][VERMAX]; int adapter[VERMAX]; int prim(int n) { bool vis[VERMAX]; int low[VERMAX]; int pos = 1; memset(vis,false,sizeof(vis)); vis[pos] = true; int ret = 0; for(int i=1; i<=n; i++) low[i] = map[pos][i]; for(int i=1; i<n; i++) { int min = 100000000; for(int j=1; j<=n; j++) { if (!vis[j] && low[j] < min) { min = low[j]; pos = j; } } ret += min; vis[pos] = true; for(int j=1; j<=n; j++) if (!vis[j] && low[j] > map[pos][j]) low[j] = map[pos][j]; } return ret; } int main(void) { int t,n; cin >> t; while (t--) { cin >> n; for(int i=1; i<=n; i++) { cin >> adapter[i]; } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { cin >> map[i][j]; if (i != j) map[i][j] += (adapter[i] + adapter[j]); } cout << prim(n) << endl; } return 0; }