N个村庄,其中一些有路联通,求还要修建的距离最小的路,使任意两个村庄两个互联
若a,b已经相连了则g[a][b]=g[b][a]=0;
prim模板
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
const int maxn=105;
const int INF=0x3f3f3f3f;
bool vis[maxn];
int lowc[maxn];
int prim(int cost[][maxn],int n)
{
int ans=0;
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)lowc[i]=cost[1][i];
for(int i=1;i<=n;i++){
int minc=INF;
int p=-1;
for(int j=1;j<=n;j++){
if(!vis[j]&&minc>lowc[j]){
minc=lowc[j];
p=j;
}
}
ans+=minc;
vis[p]=true;
for(int j=1;j<=n;j++){
if(!vis[j]&&lowc[j]>cost[p][j]){
lowc[j]=cost[p][j];
}
}
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int g[maxn][maxn];
int n,q,a,b;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&g[i][j]);
scanf("%d",&q);
while(q--){
scanf("%d %d",&a,&b);
g[a][b]=0;
g[b][a]=0;
}
printf("%d\n",prim(g,n));
}
return 0;
}