#include<iostream>
#include<fstream>
using namespace std;
/* 648K 766MS
*/
static const int MAXNODES = 501;
static const int MAXINT = ((unsigned)-1) >> 1;
static int weigh[MAXNODES][MAXNODES];
static int key[MAXNODES];
static int isin[MAXNODES];
static int cost;
static int longest;
static int n;
//#define DEBUG
void prim()
{
int i, j;
key[1] = 0; isin[1] = 0; longest = 0;
for (i = 2; i <= n; i++)
{ key[i] = MAXINT; isin[i] = 0; }
for (cost = 0, i = 1; i <= n; i++)
{
int min = MAXINT;
int mini = -1;
for(j = 1; j <= n; j++)
{
if (!isin[j] && key[j] < min)
{ min = key[j]; mini = j; }
}
isin[mini] = 1; cost += min;
if (min > longest) longest = min;
for (j = 1; j <= n; j++)
{
if (!isin[j] && weigh[mini][j] < key[j])
key[j] = weigh[mini][j];
}
}
}
int main()
{
#ifdef DEBUG
fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif
int t;
cin >> t;
while (t-- > 0)
{
int i, j;
cin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
cin >> weigh[i][j];
prim();
cout << longest << "\n";
}
return 0;
}
直接应用prim算法即可。和传统的最小生成树不同的在于所要求解的是最小代价中的最大值。
Prim算法的思想是贪心算法。算法的理论基础参加算法导论的23.2节。
Prim算法操作的对象是节点,邻接矩阵。算法过程和Dijkstra单源最短路径相似。
Prim算法的正确性的理解比Kruskal算法难。