嗯,没错是纯模板,只要会模板就能ac的,
在这里还是讲一下模板的意思吧:大致就是现在起始点附近搜距离他最近的点v1,然后再以v1为点去搜距离v1最近的点,且之前都过的点不能再搜了,不明白的就去手画一下过程吧。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=510;
const int maxm=1e6+10;
int map[maxn][maxn];
int low[maxn];
int vis[maxn];
int L[maxm];
int n,m,cnt;
long long prim()
{
long long sum=0;
int pos=1;
vis[1]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]) low[i]=map[pos][i];
}
for(int i=2;i<=n;i++)
{
int min=0x3f3f3f3f;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&min>low[j])
{
min=low[j];
pos=j;
}
}
sum+=min;
L[cnt++]=min;
vis[pos]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&low[j]>map[pos][j])
{
low[j]=map[pos][j];
}
}
}
return sum;
}
void ini()
{
memset(vis,0,sizeof(vis));
memset(L,0,sizeof(L));
memset(low,0,sizeof(low));
cnt=0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ini();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int a;
scanf("%d",&a);
map[i][j]=a;
}
}
long long ans=prim();
sort(L,L+cnt);
printf("%d\n",L[cnt-1]);
}
return 0;
}