并查集 最小生成树
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int bin[105];
int num[105][105];
struct node{
int s,e,l;
}arr[5060];
bool cmp(node a,node b)
{
return a.l<b.l;
}
int findx(int x)
{
if(x==bin[x]){
return x;
}
else{
return bin[x]=findx(bin[x]);
}
}
int merge(int x,int y)
{
int fx;
int fy;
fx=findx(x);
fy=findx(y);
if(fx!=fy){
bin[fx]=fy;
return 0;
}
else return 1;
}
int main()
{
int n,q;
while(scanf("%d",&n)==1)
{
for(int i=0;i<105;i++) bin[i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>num[i][j];
cin>>q;
int a,b;
while(q--){
cin>>a>>b;
num[a][b]=num[b][a]=0;
}
int k=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
arr[k].s=i;
arr[k].e=j;
arr[k].l=num[i][j];
k++;
}
}
sort(arr,arr+k,cmp);
int cn=0;
for(int i=0;i<k;i++)
{
if(merge(arr[i].e,arr[i].s)==0) cn+=arr[i].l;
}
cout<<cn<<endl;
}
return 0;
}