这个题目是最小生成树的一个小小的变形,让求的是最小生成树中最大边的权值。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
const int Max=600;
int Map[Max][Max],low[Max],n; //Map用来入图,low[i]记录当前点pos到i点的最小距离
bool vis[Max]; //标记点是否已经到过
int prim()
{
int pos,Min,result=0;
memset(vis,false,sizeof(vis)); //初始化vis
pos=1; //选取一点做起点
vis[pos]=true; //标记经过
for(int i=1;i<=n;i++)
if(i!=pos)
low[i]=Map[pos][i]; //首次更新low
for(int i=1;i<n;i++) //n-1次遍历所有点
{
Min=INT_MAX;
for(int j=1;j<=n;j++)
{
if(vis[j]==0&&Min>low[j])//更新出以pos到j点的最短距离
{
Min=low[j];
pos=j; //更新pos
}
}
vis[pos]=true; //标记经过
if(result<Min) //找出最小生成树中的最大边权
result=Min;
for(int j=1;j<=n;j++) //更新low数组
{
if(vis[j]==0&&low[j]>Map[pos][j])
{
low[j]=Map[pos][j];
}
}
}
return result;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&Map[i][j]);
}
}
int ans=prim();
printf("%d\n",ans);
}
return 0;
}