题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102
代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn =10000+5;
int p[maxn],mp[maxn][maxn];
struct Edge
{
int u,v,w;
bool operator <(const Edge& rhs)const
{
return w<rhs.w;//根据W的大小,从小到大排序;
}
} e[maxn];
void init()
{
for(int i=0; i<maxn; i++)
p[i]=i;
}
int find_(int x)
{
return p[x]==x? x: p[x] =find_(p[x]);
}
int main()
{
int N,Q,from,to,ans,sum,x,y;
while(scanf("%d",&N)!=EOF)
{
init();
ans =0;
sum =0;
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
{
scanf("%d",&mp[i][j]);
}
for(int i=1; i<=N; i++)
for(int j=i+1; j<=N; j++)
{
e[sum].u=i;
e[sum].v=j;
e[sum++].w=mp[i][j];
}
scanf("%d",&Q);
for(int i=0; i<Q; i++)
{
scanf("%d%d",&from,&to);
e[sum].u=from;
e[sum].v=to;
e[sum++].w=0;
}
sort(e,e+sum);
for(int i=0; i<sum; i++)
{
x=find_(e[i].u);
y=find_(e[i].v);
if(x!=y)
{
ans+=e[i].w;
p[y]=x;
}
}
printf("%d\n",ans);
}
return 0;
}