/*kruskal算法*/
#include <iostream>
//#include <fstream>
#include <algorithm>
using namespace std;
/*708K 922MS*/
typedef struct _edge
{
int x,y;
int w;
}edge; int n;
int num;
//fstream fin; void kruskal(edge *e,int len);
int cmp(const void *a,const void *b); int main()
{
//fin.open("2485.txt",ios::in);
int t;
cin>>t;
while(t--)
{
cin>>n;
edge *e=new edge[n*n];
int temp;
int len=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>temp;
if(temp)
{
e[len].x=i;
e[len].y=j;
e[len++].w=temp;
}
}
kruskal(e,len);
cout<<num<<endl;
delete []e;
}
system("pause");
return 0;
} int cmp(const void *a,const void * b)
{
edge *a1=(edge *)a;
edge *b1=(edge *)b;
return a1->w-b1->w;
} void kruskal(edge *e,int len)
{
qsort(e,len,sizeof(edge),cmp);
int *s=new int[n];
memset(s,0,sizeof(int)*n);
int parts=0;
int max,u,v; for(int i=0;i<len;i++)
{
u=e[i].x; v=e[i].y;
if(!s[u]&&!s[v])
{
parts++;
s[u]=parts;
s[v]=parts;
max=e[i].w;
}
else if(s[u]&&!s[v])
{
s[v]=s[u];
max=e[i].w;
}
else if(s[v]&&!s[u])
{
s[u]=s[v];
max=e[i].w;
}
else
{
if(s[v]!=s[u])
{
int temp1=s[u];
int temp2=s[v];
if(temp1>temp2)
{
temp1=s[v];
temp2=s[u];
}
//更新
for(int j=0;j<n;j++)
{
if(s[j]==temp2)
s[j]=temp1;
else if(s[j]>temp2)
s[j]--;
}
max=e[i].w;
}
}
} num=max;
}
这时间 估计倒数了!