1. 程式人生 > >NYOJ 38 佈線問題(普里姆演算法)

NYOJ 38 佈線問題(普里姆演算法)

38-佈線問題

題目地址

思路

最小生成樹問題,普里姆演算法

程式碼

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXVEX = 505;
const int M = 0x3f3f3f3f;
int ans = 0; //記錄最小費用
int u, v;    //頂點數,邊數
int W[1000]; //每個點與外部裝置相連所需費用
typedef struct
Map { int arc[MAXVEX][MAXVEX]; //鄰接矩陣 int numVertexes; //頂點數 } MGraph; int lowcost[MAXVEX]; //儲存相關頂點間邊的權值 void MiniSpanTree_Prim(MGraph *G) { int minx; for (int i = 1; i <= G->numVertexes; i++) { lowcost[i] = G->arc[1][i]; //將與之有邊的權值存入陣列,記錄1和i之間的權值 } lowcost[
1] = 0; for (int i = 1; i <G->numVertexes; i++) { minx = M; //初始化最小權值為無窮 int j = 1, k; while (j <= G->numVertexes) { if (lowcost[j] != 0 && lowcost[j] < minx) { minx = lowcost[j]; k = j;
//將當前最小值的下表存入k } j++; } //cout<<adjvex[k]<<" "<<k<<endl; ans += minx; //cout<<ans<<endl; lowcost[k] = 0; //將當前定點的權值設定為0,表示此頂點已經完成任務 for (j = 1; j <= G->numVertexes; j++) { if (lowcost[j] != 0 && G->arc[k][j] < lowcost[j]) { lowcost[j] = G->arc[k][j]; //將較小權值存入lowcost } } } } int main() { int t; cin >> t; while (t--) { MGraph G; //memset(G.arc,M,sizeof(G.arc)); memset(lowcost, 0, sizeof(lowcost)); cin >> u >> v; int x, y, s; //x,y相連的點,s是x,y之間點路費 G.numVertexes = u; for (int i = 0; i <= u; i++) { for (int j = 0; j <= u; j++) G.arc[i][j] = M; } for (int i = 0; i <= u; i++) G.arc[i][i] = 0; for (int i = 1; i <= v; i++) { cin >> x >> y >> s; G.arc[x][y] = G.arc[y][x] = s; // cout<<G.arc[x][y]<<" "<<G.arc[y][x]<<endl; } for (int i = 0; i < u; i++) { cin >> W[i]; } sort(W, W + u); ans = 0; MiniSpanTree_Prim(&G); ans += W[0]; cout << ans << endl; } return 0; }