一道比较简单的最小生成树问题,直接上prim然后找出权值最大的子边就好了
话说学习了几乎一天的最小生成树,现在终于有点理解两种算法的原理了。
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int T,N,ans=0;
int ax[505][505];
int dp[505],vis[505];
const int maxn=65539;
void prim()
{
int k=0;
ans=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;i++)
dp[i]=ax[1][i];
vis[1]=1;
for(int j=2;j<=N;j++)
{
int minn=maxn;
for(int i=1;i<=N;i++)
if(!vis[i]&&dp[i]<minn)
minn=dp[k=i];
vis[k]=1;
ans=max(ans,minn);
for(int c=1;c<=N;c++)
if(!vis[c]&&dp[c]>ax[k][c])
dp[c]=ax[k][c];
}
}
int main()
{
cin>>T;
int a;
while(T--)
{
cin>>N;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
cin>>a;
ax[i][j]=ax[j][i]=a;
}
prim();
cout<<ans<<endl;
}
}