#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define MAXNL 0x3fffffff
#define MAXN 0x3f3f3f3f
#define pi acos(-1.0)
using namespace std;
//#define debug
const int N=510;
int mmp[N][N];
int size;
int h[N],pos[N];
int dis[N];
bool vis[N];
inline void myswap(int x,int y){
swap(h[x],h[y]);
swap(pos[h[x]],pos[h[y]]);
}
void siftdown(int i){
int flag=0;
while(i*2<=size&&!flag){
int t=i;
if(dis[h[i]]>dis[h[2*i]]) t=2*i;
if(2*i+1<=size&&dis[h[i*2+1]]<dis[h[t]]) t=i*2+1;
if(t!=i){
myswap(t,i);
i=t;
}else flag=1;
}
}
void siftup(int i){
int flag=0;
if(i==1) return ;
while(i!=1&&!flag){
if(dis[h[i]]<dis[h[i/2]]) myswap(i,i/2);
else flag=1;
i/=2;
}
}
int pop(){
int t=h[1];
h[1]=h[size];
size--;
pos[h[1]]=1;
siftdown(1);
return t;
}
int main()
{
#ifdef debug
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // debug
int n,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",&mmp[i][j]);
}
}
for(int i=1;i<=n;i++){
dis[i]=mmp[1][i];
}
//初始化堆
size=n;
for(int i=1;i<=size;i++){
h[i]=i;
pos[i]=i;
}
for(int i=size/2;i>=1;i--){
siftdown(i);
}
mm(vis,0);
vis[1]=1;
int cnt=1,sum=0;
pop();
int ans=0;
while(cnt<n){
int j=pop();
vis[j]=1;cnt++;sum+=dis[j];
ans=max(dis[j],ans);
for(int i=1;i<=n;i++){
if(!vis[i]&&dis[i]>mmp[j][i]){
dis[i]=mmp[j][i];
siftup(pos[i]);//pos[i]表示i顶点在堆中的位置。
}
}
}
printf("%d\n",ans);
}
return 0;
}
POJ 2485 (prim+堆)
猜你喜欢
转载自blog.csdn.net/qq_40679299/article/details/80768196
今日推荐
周排行