poj 2485

#include<iostream>
#include<fstream>

using namespace std;

int n;
int f[501];
int rank[501];

struct e{
    int s,t,w;
};

e edge[250001];


void init(){
    for(int i=1;i<=n;i++)
    {
        f[i]=i;
        rank[i]=0;
    }
}
int top;

void add(int s,int t,int w){
    edge[++top].s=s;
    edge[top].t=t;
    edge[top].w=w;
}

int cmp(const void *a,const void *b){
    return (*(e *)a).w-(*(e*)b).w;
}

int father(int s){
    if(s!=f[s])
        f[s]=father(f[s]);
    return f[s];
}

void unionset(int s,int t){
    int i=father(s);
    int j=father(t);
    if(rank[i]<rank[j])
        f[i]=j;
    else
    {
        f[j]=i;
        if(rank[i]==rank[j])
            rank[i]++;
    }
}



void solve(){
    int i,j,k;
    qsort(edge+1,top,sizeof(e),cmp);
    j=0;
    for(i=1;i<=top;i++)
    {
        if(father(edge[i].s)!=father(edge[i].t))
        {
            j++;
            if(j==n-1)
            {
                cout<<edge[i].w<<endl;
                return;
            }
            unionset(edge[i].s,edge[i].t);
        }
    }
}


void read(){
//    ifstream cin("in.txt");
    int i,j,k;
    int cas;
    cin>>cas;
    while(cas--)
    {
        cin>>n;
        top=0;
        init();
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                cin>>k;
                if(i>j)
                    add(i,j,k);
            }
        solve();
    }
}

int main(){
    read();
    return 0;

}

posted on 2011-05-31 10:32  宇宙吾心  阅读(272)  评论(0)    收藏  举报

导航