#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0xfffff
int p[510],n,m,s,flag,ans;
struct e
{
int a,b,c;
}path[250010];
int cmp(e a,e b)
{
return a.c<b.c;
}
int find(int k)
{
while(p[k]>0)
{
k=p[k];
}
return k;
}
void kruskal(int a,int b,int c)
{
int f1=find(a);
int f2=find(b);
if(f1!=f2)
{
p[f1]=f2;
if(c>ans)
ans=c;//最小树的最大边
}
}
void inti()
{
for(int i=0;i<n;i++)
p[i]=0;
}
int main()
{ int tt;
scanf("%d",&tt);
while(tt--)
{scanf("%d",&n);
//memset(path,0,sizeof(path));
int num=0;
inti();
ans=0;
int aa,bb,cc;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{scanf("%d",&aa);
if(i<j){path[num].a=i;
path[num].b=j;
path[num].c=aa;
num++;
}//处理一下需要排序的结构体
}
}
sort(path,path+num,cmp);
for(int i=0;i<num;i++)
kruskal(path[i].a,path[i].b,path[i].c);
printf("%d\n",ans);
}
}
求最小树的最大边,数组开小WA一次
prime 1A
#include<stdio.h>
#include<string.h>
using namespace std;
int map[510][510],vis[510],dis[510],n;
#define inf 0xffffff
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=inf;
}
void prime()
{ int ans=0;
for(int i=1;i<=n;i++)
{
dis[i]=map[1][i];
vis[i]=0;
}
vis[1]=1;
for(int i=1;i<n;i++)
{
int min=inf,k;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&min>dis[j])
{
k=j;
min=dis[j];
}
}
// printf("min=%d",min);
vis[k]=1;
if(min!=inf&&min>ans)
ans=min;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>map[k][j])
dis[j]=map[k][j];
}
}
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{ int te;
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{scanf("%d",&te);
if(i<j) map[i][j]=map[j][i]=te; }
prime();
}
}