#include <iostream>
using namespace std;
#define SIZE 502
int father[SIZE];
int n,size;
struct Edge
{
int sta,end,weigh;
} e[SIZE*SIZE/2];
int cmp(const void* a, const void* b)
{
return (*(Edge*)a).weigh - (*(Edge*)b).weigh;
}
/*
int setFind(int x)
{
if (x == father[x])
return x;
else return father[x] = setFind(father[x]);
}*/
int setFind(int x)
{
if ( father[x] < 0 )
return x;
else return father[x] = setFind(father[x]);
}
void setUnion(int root1, int root2)
{
if ( father[root1] < father[root2] )
father[root2] = root1;
else {
if ( father[root1] == father[root2] )
father[root2]--;
father[root1] = root2;
}
}
int Kruskal()
{
int eNum = 0;
int i,max = 0;
for ( i = 0; i < n; i++ )//根据父结点初始化的不同,用了两套并查集,目前未被注释掉的时间235ms,找不到好的优化方法了,注释掉的是250ms。
father[i] = -1;
/*
for ( i = 0; i < n; i++ )
father[i] = i;*/
qsort(e,size,sizeof(e[0]),cmp);
i = 0;
while ( eNum <= n-1 && i < size )
{
int Uset = setFind(e[i].sta);
int Vset = setFind(e[i].end);
if ( Uset != Vset )
{
max = e[i].weigh;
setUnion(Vset, Uset); //father[Vset] = Uset;
eNum++;
}
i++;
}
return max;
}
int main()
{
int cas;
int i,j,w;
scanf("%d",&cas);
while ( cas-- )
{
cin >> n;
size = 0;
for ( i = 0; i < n; i++ )
for ( j = 0; j < n; j++ )
{
scanf("%d",&w);
if ( i < j )
{
e[size].sta = i;
e[size].end = j;
e[size].weigh = w;
size++;
}
}
printf("%d\n",Kruskal());
}
return 0;
}
poj2485 Kruskal
最新推荐文章于 2016-04-12 21:39:39 发布