· 最小生成树问题,求出最小生成树顺便记录其最长距离即可。可任选Kruskal、Prim算法中的一种,时间复杂度都一样。我选择了Prim算法,认为它比较好实现一点。
· 开一个二维数组存图,再开一个一维数组表示两个点集。
代码如下:
#include <iostream>
#include <memory.h>
using namespace std;
int map[501][501];
int mark[501];
int n,Max;
void prim()
{
mark[1] = 1;
int cnt = 0;
while(cnt != n - 1)
{
int min_dis = 65537;
int min_node = 0;
for (int i = 1;i <= n;i ++)
{
for (int j = 1;j <= n;j ++)
{
if (map[i][j] != 0 && mark[i] == 1 && mark[j] == 0)
{
if (map[i][j] < min_dis)
{
min_dis = map[i][j];
min_node = j;
}
}
}
}
mark[min_node] = 1;
cnt ++;
if (min_dis > Max) Max = min_dis;
}
}
int main()
{
int t;
cin >> t;
while(t --)
{
memset(map,0,sizeof(map));
memset(mark,0,sizeof(mark));
Max = 0;
cin >> n;
for (int i = 0;i < n;i ++)
{
for (int j = 0;j < n;j ++)
cin >> map[i + 1][j + 1];
}
prim();
if (t == 0) cout << Max << endl;
else
cout << Max << endl << endl;
}
}