http://poj.org/problem?id=2421
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; int n; struct edge { int a,b; int len; } edges[10011]; int Num; int map[111][111]; int parent[111]; int cmp(const void *a,const void *b) { struct edge *c,*d; c=(struct edge *)a; d=(struct edge *)b; return c->len-d->len; } void build(int num) { int i; for(i=1; i<=num; i++) parent[i]=i; } int find(int k) { if(parent[k]==k) return k; parent[k]=find(parent[k]); return parent[k]; } void Union(int f1,int f2) { parent[f2]=f1; } int Kruskal() { int i; int f1,f2; int ans; ans=0; qsort(edges,Num,sizeof(edges[0]),cmp); for(i=0; i<Num; i++) { f1=find(edges[i].a); f2=find(edges[i].b); if(f1==f2) continue; ans+=edges[i].len; Union(f1,f2); } return ans; } int main() { int m,i,l,a,b,f1,f2,ans; //freopen("1.txt","r",stdin); while(scanf("%d",&n)!=-1) { build(n); for(i=1; i<=n; i++) for(l=1; l<=n; l++) scanf("%d",&map[i][l]); Num=0; for(i=2; i<=n; i++) for(l=1; l<i; l++) { edges[Num].a=i; edges[Num].b=l; edges[Num].len=map[i][l]; Num++; } scanf("%d",&m); while(m--) { scanf("%d%d",&a,&b); f1=find(a); f2=find(b); if(f1==f2) continue; Union(f1,f2); } printf("%d\n",Kruskal()); } return 0; }