大意就是找一个最小的生成树,然后找到里面的最大边即可
简单的一...一塌糊涂,不过还是推荐prim算法,ku...算法适合稀疏图,是根据边算的,毕竟这个算是完全图了
一遍AC真实让今天烦恼尽消
#pragma warning (disable:4996)
/*
coded by fgtmiao
time:2019/6/29
*/
//即找到最小生成树的最大边,不过如果是找到能联通的所需要的最小长度要怎么做呢?二分然后按照答案反查?
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int dist[501][501];
int N,T;
const int inf = 99999999;
bool inset[501];//端点是否在集合里
//使用prime算法嗷
int prime()
{
vector<int>edges;
memset(inset, 0, sizeof(inset));
inset[0] = 1;
for (int lop = 0; lop < N-1; lop++)//最多n-1边
{
int minn = inf;
int idx = -1;
for (int i = 0; i < N; i++)
{
if (inset[i])
{
for (int j = 0; j < N; j++)
{
if (!inset[j])//i在集合中,j不在集合中
{
if (minn > dist[i][j])
{
minn = dist[i][j];//找到连接两个集合的最小边
idx = j;
}
}
}
}
}
inset[idx] = 1;
edges.push_back(minn);
}
int maxx = -inf;
for (int i = 0; i < edges.size(); i++)
{
maxx = max(maxx, edges[i]);
}
return maxx;
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d", &N);
if (N == 0)return 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> dist[i][j];
}
}
printf("%d\n",prime());
}
return 0;
}