这题是prim稍微变形了一下。只要把建好路的两点map[i][j]置为0,就ok了。搜easy
#include<cstdio>
#include<cstring>
const int INF=1e9;
int map[105][105];
int low[105],vis[105];
void prim(int from,int m)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++)low[i]=map[from][i];
low[from]=0;
vis[from]=1;
for(int i=1;i<=m;i++){
int x,MIN=INF;
for(int y=1;y<=m;y++){
if(!vis[y]&&low[y]<MIN)
MIN=low[x=y];
}
vis[x]=1;
for(int y=1;y<=m;y++){
if(!vis[y]&&low[y]>map[x][y])
low[y]=map[x][y];
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
int cas=n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
}
int q;
scanf("%d",&q);
int from,to;
while(q--){
scanf("%d%d",&from,&to);
map[from][to]=map[to][from]=0;
}
prim(1,n);
int sum=0;
for(int i=1;i<=n;i++)sum+=low[i];
printf("%d\n",sum);
return 0;
}