
↑每一次选出合理的最小边,贪心衍生。

#include <iostream> #include<limits.h>//get一个最大宏 using namespace std; const int max1=101; int map[max1][max1],dist[max1],pre[max1]; int prim(int n); { int total=0,min; int i,j,k; bool flag[max1];//flag[i]=true则i选过(已加入最小树集),=false则未选过 for(i=2;i<=n;i++)//从2开始,第一个点特殊定义 { flag[i]=false;//一开始点全部未选过 dist[i]=map[1][i];//把第一层的值先放进dist中 pre[i]=1;//pre记录连接情况,现在所有点都还没有连接 } dist[1]=0; flag[1]=true;//正在处理 for(i=1;i<n;i++)//到n-1结束,最后一个点在处理倒数第二个点时连接 { min=INT_MAX; k=0;//清理现场 for(j=1;j<=n;j++) { if(!flag[j]&&dist[j]<min)//没有被选中的,离当前点最近的点 { min=dist[j]; k=j; } } if(k==0)return -1;//没有点可以扩展了 flag[k]=true; total=total+min; for(j=1;j<=n;j++)//更新下一个要搜索的点到当前选择的点的距离 { if(!flag[j]&&map[k][j]!=INT_MAX&&map[k][j]<dist[j]) { dist[j]=map[k][j]; pre[j]=k; } } } return total; } int main(int argc, char *argv[]) { int n; int i,j,ans; cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>map[i][j];//储存图像信息 ans=prim(n); cout<<ans; return 0; }
↑从一个点通过最小的边走到下一个点。
来源:https://www.cnblogs.com/cici08/p/9304051.html