题目链接:http://poj.org/problem?id=2485
思路:还是赤裸裸的最小生成树,第一次提交TLE了,把所有的 cin 和 cout 改成 scanf( ) 和 printf( ) 就直接188MS通过。cin和cout的效率太低了。
从昨晚开始到写了三道最小生成树的题,发现这三道题几乎可以直接用一个模板写,基本没什么变化。但是通过自己手敲这三个代码的确对kruskal的掌握更好了,大神博客里都说尽量不要用模板是很有道理的。
///2014.7.8
///poj2485
//Accepted 892K 188MS G++ 1433B 2014-07-08 09:16:46
/*
*最小生成树,kruskal算法
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct Road
{
int x,y,l;
};
bool cmp(Road a,Road b){
return a.l < b.l;
}
int t,n;
int maxl;
Road road[130000];
int dSet[550];
int find(int x){
while( dSet[x] != x )
x = dSet[x];
return x;
}
bool judge(int x,int y){
int fx = find(x);
int fy = find(y);
if( fx==fy )
return false;
else{
dSet[fy] = fx;
return true;
}
}
void init(){
for(int i=0 ; i<n ; i++)
dSet[i] = i;
maxl = 0;
int temp;
int k = 0;
for(int i=0 ; i<n ; i++){
for(int j=0 ; j<n ; j++){
scanf("%d",&temp);
if( i<j ){
road[k].x = i;
road[k].y = j;
road[k].l = temp;
k++;
}
}
}
}
int kruskal(){
sort(road,road+n*(n-1)/2,cmp);
int i=0,j=0;
while( i<n-1 ){
if( judge( road[j].x , road[j].y) ){
maxl = road[j].l;
i++;
}
j++;
}
}
int main(){
// freopen("in","r",stdin);
// freopen("out","w",stdout);
scanf("%d",&t);
while( t-- ){
scanf("%d",&n);
init();
kruskal();
printf("%d\n",maxl );
}
return 0;
}