题意:

给出各个点的之间的距离,用最少的路将这些点连通起来。


思路:题目其实就是求最小生成树,我用了prim。那些已经连通的点将距离设置为0。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const int N=105;
#define inf 0x3f3f3f3f
int ma[N][N],vis[N],dis[N],cost;
int n;
void prim(){
for(int i=1;i<=n;i++){
dis[i]=ma[1][i];
vis[i]=0;
}
dis[1]=0;
vis[1]=1;
for(int i=1;i<=n;i++){
int mi=inf,mb=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<mi){
mi=dis[j];
mb=j;
}
}
if(mi==inf) break;
vis[mb]=1;
cost+=dis[mb];
for(int i=1;i<=n;i++){
if(!vis[i]&&ma[mb][i]<dis[i]){
dis[i]=ma[mb][i];
}
}

}

}
int main(){
while(scanf("%d",&n)!=EOF){
cost=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&ma[i][j]);
int Q;
scanf("%d",&Q);
for(int i=0;i<Q;i++){
int a,b;
scanf("%d%d",&a,&b);
ma[a][b]=ma[b][a]=0;
}
prim();
cout<<cost<<endl;
}

return 0;
}