kruskal算法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn = 110;
using namespace std;
int rt[maxn];
struct edge{
int l,r,w;
}ee[maxn*maxn];
int map[maxn][maxn],flag[maxn][maxn];
int nedge;//路的条数
bool Cmp(edge x, edge y){ return x.w < y.w; }
void Build(int n){
for(int i = 1; i <= n; ++i)
rt[i] = i;
}
int Find(int x){
if(rt[x] == x) return x;
return Find(rt[x]);
}
void Union(int x, int y){
int xrt = rt[x];
int yrt = rt[y];
if(xrt != yrt)
rt[xrt] = yrt;
}
int Kruskal(){
int rt1,rt2,ans=0;
for(int i = 0; i < nedge; ++i){
rt1 = Find(ee[i].l);
rt2 = Find(ee[i].r);
if(rt1 != rt2){
ans += ee[i].w;
Union(rt1,rt2);
}
}
return ans;
}
int main()
{
int n;
while(~scanf("%d",&n)){
Build(n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n ; ++j)
scanf("%d",&map[i][j]);
nedge = 0;
for(int i = 1; i < n; ++i)
for(int j = i+1; j <= n; ++j){
ee[nedge].l = i;
ee[nedge].r = j;
ee[nedge].w = map[i][j];
nedge++;
}
int m;
scanf("%d",&m);
while(m--){
int a,b;
scanf("%d %d",&a,&b);
int rt1 = Find(a);
int rt2 = Find(b);
Union(rt1,rt2);
}
sort(ee,ee+nedge,Cmp);
printf("%d\n",Kruskal());
}
return 0;
}