POJ 2485 (prim+堆)

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/80768196