NYOJ 38 佈線問題(普里姆演算法)
阿新 • • 發佈:2019-01-01
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;
}