/*题意:Flatopia岛要修路,这个岛上有n个城市,要求修完路后,
各城市之间可以相互到达,且修的最长的一段路最短.输出最短的最长路。
#define INF 70000
using namespace std;
int main()
{
int a[510][510],v[510],dis[510];
freopen("in.txt","r",stdin);
int m;
scanf("%d",&m);
for (int k=1;k<=m;k++)
{
int i,j,n;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++) scanf("%d",&a[i][j]);
v[i]=0;
dis[i]=INF;
}
dis[1]=0;
int ans=0;
for (i=1;i<=n;i++)
{
int mark=-1;
for (j=1;j<=n;j++)
if (!v[j])
{
if (mark==-1) mark=j;
else if (dis[mark]>dis[j]) mark=j;
}
if (mark==-1) break;
v[mark]=1;
if (dis[mark]>ans) ans=dis[mark];
for (j=1;j<=n;j++)
if (!v[j])
if (a[mark][j]<dis[j]) dis[j]=a[mark][j];
}
cout<<ans<<endl;
}
return 0;
}
各城市之间可以相互到达,且修的最长的一段路最短.输出最短的最长路。
算法:prim 输出最小生成树的最大权值*/
#include <iostream>
#include <cstdio>#define INF 70000
using namespace std;
int main()
{
int a[510][510],v[510],dis[510];
freopen("in.txt","r",stdin);
int m;
scanf("%d",&m);
for (int k=1;k<=m;k++)
{
int i,j,n;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++) scanf("%d",&a[i][j]);
v[i]=0;
dis[i]=INF;
}
dis[1]=0;
int ans=0;
for (i=1;i<=n;i++)
{
int mark=-1;
for (j=1;j<=n;j++)
if (!v[j])
{
if (mark==-1) mark=j;
else if (dis[mark]>dis[j]) mark=j;
}
if (mark==-1) break;
v[mark]=1;
if (dis[mark]>ans) ans=dis[mark];
for (j=1;j<=n;j++)
if (!v[j])
if (a[mark][j]<dis[j]) dis[j]=a[mark][j];
}
cout<<ans<<endl;
}
return 0;
}