给你邻接矩阵,然后求最小生成树上最长的边,其实就是求prim算法,然后把ans由求和变成求最大值就行。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define INF 0x3f3f3f3f
#define MAX(a1,b1) (a1)>(b1)?(a1):(b1)
using namespace std;
const int N = 505;
int n,ans,dis[N],map[N][N];
bool vis[N];
void pri()
{
memset(vis,false,sizeof(vis));
vis[1] = true;
for(int i=2;i<=n;++i)
dis[i] = map[1][i];
int count = n - 1;
while(count--)
{
int k,mi = INF;
for(int i=2;i<=n;++i)
if(!vis[i]&&mi>dis[i])
{
mi = dis[i];
k = i;
}
vis[k] = true;
ans = MAX(ans,mi);
for(int i=2;i<=n;++i)
if(!vis[i]&&map[k][i]<dis[i])
dis[i] = map[k][i];
}
}
int main(void)
{
int ncase;
cin>>ncase;
while(ncase--)
{
cin>>n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&map[i][j]);
ans = -1;
pri();
cout<<ans<<endl;
}
return 0;
}