C++,Prim普里姆算法求最小生成树
思想:蓝白点。未加入生成树的点标记为蓝点,加入生成树的点标记为白点。
每次循环找到当前离白点集团最近的蓝点,加入最小生成树(标记为白点)。
更新每个蓝点到白点集团的最小值。
#include<iostream> #include<cstring> using namespace std; int main(){ int n,i,j; int e[101][101]; int minn[101]; bool u[101]; int ans=0; memset(minn,0x7f,sizeof(minn));//将最小值设置为maxint minn[1]=0;//这样设置是为了第一次循环把1加入生成树 memset(u,1,sizeof(u));//将所有点设置为蓝点(标记为未加入最小生成树) cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>e[i][j];//构造邻接矩阵 int k; for(i=1;i<=n;i++){ k=0; for(j=1;j<=n;j++) if(u[j]&&minn[j]<minn[k]) {k=j;}//找出当前离白点集团最近的蓝点 u[k]=0;//将这个蓝点加入白点集团 for(j=1;j<=n;j++) if(u[j]&&e[k][j]<minn[j]){ minn[j]=e[k][j];//更新每个蓝点到白点集团的最小值 } } for(i=1;i<=n;i++){ ans+=minn[i]; } cout<<ans; return 0; }