#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
typedef __int64 ll;
struct node
{
ll w;
int u,v;
} edge[105*105/2];
int f[105];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int _find(int x)
{
if(x!=f[x])
f[x]=_find(f[x]);
return f[x];
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int cnt=0;
for(int i=1; i<=n; i++)
{
f[i]=i;
for(int j=1; j<=n; j++)
{
ll a;
scanf("%I64d",&a);
if(i>j)
{
edge[cnt].w=a;
edge[cnt].u=i;
edge[cnt].v=j;
cnt++;
}
}
}
sort(edge,edge+cnt,cmp);
int t;
int q;
scanf("%d",&q);
while(q--)
{
int a,b;
scanf("%d%d",&a,&b);
int fa=_find(a),fb=_find(b);
if(fa!=fb)
fa>fb?f[fa]=fb:f[fb]=fa;
}
ll ans=0;
for(int i=0; i<cnt; i++)
{
int fa=_find(edge[i].u),fb=_find(edge[i].v);
if(fa!=fb)
{
fa>fb?f[fa]=fb:f[fb]=fa;
ans+=edge[i].w;
}
}
printf("%I64d\n",ans);
}
}
hdu1102 最小生成树
最新推荐文章于 2018-09-03 09:52:04 发布