水一发
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 105;
using namespace std;
struct node
{
int u,v,val;
};
int cmp(node a, node b)
{
return a.val < b.val;
}
node e[maxn*maxn];
int n,par[maxn],rot[maxn];
void Init()
{
for(int i = 0; i < maxn; i++)
{
par[i] = i;
rot[i] = 0;
}
}
int Find(int x)
{
if(x == par[x])
return x;
par[x] = Find(par[x]);
return par[x];
}
int Union(int x, int y)
{
x = Find(x);
y = Find(y);
if(x == y)return 0;
if(rot[x] > rot[y])
{
par[y] = x;
}
else
{
par[x] = y;
rot[y]++;
}
return 1;
}
int main()
{
int t,x,q,u,v;
while(scanf("%d",&n) != EOF)
{
t = 0;
Init();
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
scanf("%d",&x);
if(i > j)
{
e[t].u = i;
e[t].v = j;
e[t++].val = x;
}
}
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&u,&v);
Union(u,v);
}
sort(e,e+t,cmp);
int ans = 0;
for(int i = 0; i < t; i++)
{
//printf("%d %d %d\n",e[i].u,e[i].v,e[i].val);
if(Union(e[i].u, e[i].v))
ans+=e[i].val;
}
printf("%d\n",ans);
}
return 0;
}