题目:https://www.luogu.org/problemnew/show/P2820
数据规模较小,所以用数据结构选用邻接矩阵。
求MST,根据数据规模选用prim算法。
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,k;
int f[101][101],dis[101];
int prim(){
int N=1;/*根结点,染白*/
dis[N]=0;
int mst=0;
for(int ii=1;ii<n;ii++)/*共进行n-1次加边与点的操作*/
for(int i=1;i<=n;i++){
/*松驰与白点相邻的蓝点的dis值*/
for(int j=1;j<=n;j++)
if(f[N][j] && dis[j])
if(dis[j]>f[N][j])dis[j]=f[N][j];
/*寻找蓝点中dis最小的点以染白*/
int minn=10000;
for(int j=1;j<=n;j++)
if(dis[j] && minn>dis[j]){
minn=dis[j];
N=j;
}
mst+=dis[N];/*更新mst*/
dis[N]=0;/*结点N染白*/
}
return mst;
}
int main(){
cin>>n>>k;
int x,y,z,sum=0;
for(int i=1;i<=k;i++){
cin>>x>>y>>z;
f[x][y]=f[y][x]=z;
sum+=z;
dis[i]=10000;/*初始化dsi[]为一个很大的值*/
}
cout<<sum-prim()<<endl;
}