题解
最小生成树裸题。Kruskal方法解答,用并查集对节点检查合并。代码很简练。
Code
// head files excluded
using namespace std;
int n,m,k;
struct edge{
int x,y,v;
} cot[20000];
int f[200];
bool cmp(edge &a, edge &b){
return a.v<b.v;
}
int findf(int x){
if( x == f[x] ) return x;
else f[x] = findf(f[x]);
return f[x];
}
int main(void){
cin>>n;
int val,k=0;
for(int i=1;i<=n;i++){
f[i] = i;
for(int j=1;j<=n;j++){
cin>>val;
if(j>i){
cot[k].x =i;
cot[k].y =j;
cot[k].v =val;
k++;
}
}
}
sort(cot,cot+k,cmp);
int ans = 0,ct=0;
for(int i=0;i<k;i++){
if( findf(cot[i].x) != findf( cot[i].y ) ){
f[ findf(cot[i].y) ] = cot[i].x;// f[cot[i].y] = cot[i].x is wrong!!
ans+=cot[i].v;
ct++;
if(ct==n-1) break;
}
}
cout<<ans<<endl;
return 0;
}