因为让你求最长边,所以首先想到的是Kruskal算法(因为加入生成树的最后一条边是最大边),注意n个城市有n-1条边!!!
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct
{
int from,to,c;
} road;
road r[250010];
int fa[510];
int count;
int cmp(const void *a,const void *b)
{
return (((road *)a)->c > ((road *)b)->c)?1:-1;
}
int find(int a )
{
return fa[a]==a?a:fa[a]=find(fa[a]);
}
int main()
{
int cas,ans,n,i,j;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
int sum=0;
for(i=0; i<n; i++)
{
int temp_1,temp_2;
scanf("%d",&temp_1);
fa[i]=i;
r[sum].from=r[sum].to=i;
r[sum++].c=temp_1;
for(j=1; j<n; j++)
{
scanf("%d",&temp_2);
r[sum].from=i;
r[sum].to=j;
r[sum++].c=temp_2;
}
}
qsort(r,sum,sizeof(road),cmp);
for(i=0; i<sum; i++)
{
int fa1=find(r[i].from);
int fa2=find(r[i].to);
if(fa1!=fa2)
{
fa[fa2]=fa1;
n--;
if(n==1)
{
ans=r[i].c;
break;
}
}
}
printf("%d\n",ans);
}
return 0;
}