1. 程式人生 > >ZOJ-1586 QS Network---最小生成樹Prim

ZOJ-1586 QS Network---最小生成樹Prim

type ble zoj col urn 初始化 algorithm ++ work

題目鏈接:

https://vjudge.net/problem/ZOJ-1586

題目大意:

首先給一個t,代表t個測試樣例,再給一個n,表示有n個QS裝置,接下來一行是n個QS裝置的成本。接下來是n*n的矩陣,表示每兩個QS 裝置之間鏈接需要的費用。求在全聯通的情況下求最少費用。

思路:

這裏需要求最少費用,由於點和邊都有權值,索性直接把兩端點的權值加到邊的權值上,那就變成了一個裸的MST題目了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5
#include<cmath> 6 #include<queue> 7 #include<stack> 8 #include<map> 9 #include<sstream> 10 using namespace std; 11 typedef long long ll; 12 const int maxn = 2e3 + 10; 13 const int INF = 1 << 30; 14 int dir[4][2] = {1,0,0,1,-1,0,0,-1}; 15 int T, n, m, x; 16 int Map[maxn][maxn];//
存圖 17 int lowcost[maxn], mst[maxn]; 18 int a[maxn]; 19 void prim(int u)//最小生成樹起點 20 { 21 int sum_mst = 0;//最小生成樹權值 22 for(int i = 1; i <= n; i++)//初始化兩個數組 23 { 24 lowcost[i] = Map[u][i]; 25 mst[i] = u; 26 } 27 mst[u] = -1;//設置成-1表示已經加入mst 28 for(int i = 1; i <= n; i++)
29 { 30 int minn = INF; 31 int v = -1; 32 //在lowcost數組中尋找未加入mst的最小值 33 for(int j = 1; j <= n; j++) 34 { 35 if(mst[j] != -1 && lowcost[j] < minn) 36 { 37 v = j; 38 minn = lowcost[j]; 39 } 40 } 41 if(v != -1)//v=-1表示未找到最小的邊, 42 {//v表示當前距離mst最短的點 43 //printf("%d %d %d\n", mst[v], v, lowcost[v]);//輸出路徑 44 mst[v] = -1; 45 sum_mst += lowcost[v]; 46 for(int j = 1; j <= n; j++)//更新最短邊 47 { 48 if(mst[j] != -1 && lowcost[j] > Map[v][j]) 49 { 50 lowcost[j] = Map[v][j]; 51 mst[j] = v; 52 } 53 } 54 } 55 } 56 //printf("weight of mst is %d\n", sum_mst); 57 cout<<sum_mst<<endl; 58 } 59 int main() 60 { 61 cin >> T; 62 while(T--) 63 { 64 cin >> n; 65 for(int i = 1; i <= n; i++)cin >> a[i]; 66 for(int i = 1; i <= n; i++) 67 { 68 for(int j= 1; j <= n; j++) 69 { 70 cin >> Map[i][j]; 71 if(i == j)continue; 72 Map[i][j] += a[i] + a[j];//把兩個端點的權值加在邊上,就轉變成裸的MST題目了 73 } 74 } 75 prim(1); 76 } 77 return 0; 78 }

ZOJ-1586 QS Network---最小生成樹Prim