原题链接: http://poj.org/problem?id=2421

测试样例
Sample Input
 3
 0 990 692
 990 0 179
 692 179 0
 1
 1 2
 Sample Output
 179
题意: N个村庄需要修路,请你找出最少花费。
解题思路: 最小生成树模板题,我们要细心,理解其中原理,这里指路一篇blog:Kruskal算法
AC代码
/*
*注
*
*/
//POJ不支持
using namespace std;
const int inf=0x3f3f3f3f;//无穷大。
const int maxn=1e5;//限定值。
typedef long long ll;
int n;
int father[maxn];
struct node{
  int u,v,w;
  bool operator<(const node&a){
    return w<a.w;
  }
};
int Find(int x){
  int r=x;
  while(r!=father[r]){
    r=father[r];
  }
  int i=x,j;
  while(father[i]!=r){
    j=father[i];
    father[i]=r;
    i=j;
  }
  return r;
}
int main(){
  while(cin>>n){
    node pays[maxn];
    int cnt=0;
    int u,v,w;
    rep(i,1,n){
      rep(j,1,n){
        cin>>w;
        if(i!=j){
          pays[cnt].u=i,pays[cnt].v=j,pays[cnt].w=w;
          cnt++;
        }
      }
    }
    rep(i,1,n){
      father[i]=i;
    }
    int q;
    cin>>q;
    int fu,fv;
    while(q--){
      cin>>u>>v;
      fu=Find(u),fv=Find(v);
      if(fu!=fv){
        father[fu]=fv;
      }
    }
    sort(pays,pays+cnt);
    int ans=0;
    rep(i,0,cnt-1){
      fu=Find(pays[i].u),fv=Find(pays[i].v);
      if(fu!=fv){
        ans+=pays[i].w;
        father[fu]=fv;
      }
    }
    cout<<ans<<endl;
  }
  return 0;
}                
                










