题目连接:http://poj.org/problem?id=1258
思路:原始的最小生成树。第一次写kruskal算法,一开始老是RE,还不明白怎么了,原来连kruskal的过程都忘了。对不起数据结构老师。。。
///2014.7.7
///poj1258
/*
*最小生成树,kruskal算法
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int sum;
struct road{
int x,y,l; //x,y表示路连接的村庄,l表示路的长度
};
road r[5500];
int dSet[110]; //并查集,用于判断要加入的边会不会与前面的边形成回路
int find(int x){
if( dSet[x]==x )
return x;
else
return find(dSet[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;
sum = 0;
int k=0;
for(int i=0 ; i<n ; i++){
for(int j=0 ; j<n ; j++){
int temp;
cin>>temp;
if(i<j){
r[k].x = i;
r[k].y = j;
r[k].l = temp;
k++;
}
}
}
}
bool cmp(road a,road b){
return a.l < b.l ;
}
void kruskal(){
sort(r,r+n*(n-1)/2,cmp);
int i=0,j=0;
while( i<n-1 ){
if( judge(r[j].x,r[j].y) ){
sum += r[j].l;
i++;
}
j++;
}
}
int main(){
// freopen("in","r",stdin);
// freopen("out","w",stdout);
while( cin>>n ){
init();
kruskal();
cout<<sum<<endl;
}
return 0;
}