题意:
给你n个城市,然后给出每个城市的距离。
再给你说已经有哪些城市已经连起来了。
剩下问你联通的最小修路代价是多少。
题解:
最小生成树。把连好的城市距离改成0就行了。
直接模板。
#include<iostream>
#include<queue>
#include<stdio.h>
#define ll long long
using namespace std;
const int maxn= 111;
int a[maxn][maxn];
int dis[maxn];
int n,m,x,y;
void prim(){
int i,j,k,mina;
bool f[maxn];
for(i=2;i<=n;++i){
f[i]=0;
dis[i]=a[1][i];
}
dis[1]=0;
f[1]=1;
for(i=1;i<=n-1;++i){
mina=9999999;
k=0;
for(j=1;j<=n;++j){
if(!f[j]&&dis[j]<mina){
mina=dis[j];
k=j;
}
}
if(k==0) return;
f[k]=1;
for(j=1;j<=n;++j){
if(!f[j]&&a[k][j]!=9999999&&dis[j]>a[k][j]){
dis[j]=a[k][j];
}
}
}
}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&a[i][j]);
scanf("%d",&m);
while(m--){
scanf("%d %d",&x,&y);
a[x][y]=a[y][x]=0;
}
prim();
int ans=0;
for(int i=1;i<=n;++i)
ans+=dis[i];
printf("%d\n",ans);
}
return 0;
}