思想:藍白點。未加入生成樹的點標記為藍點,加入生成樹的點標記為白點。
每次循環找到當前離白點集團最近的藍點,加入最小生成樹(標記為白點)。
更新每個藍點到白點集團的最小值。

#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; }