这道题和2253一个思路,因为最后要全联通,所以不妨采用dijstra的思路,dis【i】表示第i个点到第1个点的所有可能路径的最大边权的最小值,则有如下递推方程:
if{dis[i] > max{dis[j],map[i][j]} dis[i] = max{dis[j],map[i][j]}
代码:
#include<iostream>
#include<algorithm>
#define MAX 200000000
using namespace std;
int dis[501],map[501][501],visit[501];
int n;
int main()
{
int t,i,j,ans,k;
cin>>t;
while(t--)
{
cin>>n;
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
for(i=1;i<=n;i++) dis[i]=map[1][i];
ans=0;
visit[1]=1;
for(i=2;i<=n;i++)
{
dis[1]=0;
int mp=MAX;
int m=1;
for(j=2;j<=n;j++)
{
if(!visit[j]&&dis[j]<mp)
{
mp=dis[j];
m=j;
}
}
if(ans<mp) ans=mp;
visit[m]=1;
for(j=2;j<=n;j++)
{
if(!visit[j]&&dis[j]>max(mp,map[m][j]))
dis[j]=max(mp,map[m][j]);
}
}
cout<<ans<<endl;
}
//system("pause");
return 0;
}