贪心算法-最小生成树
Prim算法实现
代码如下:
#include <iostream> using namespace std; typedef struct Node { int shortdist; //用于记录到节点的最短距离 int flag; //用作标志变量,表示借点已经加入到集合中 int prev; //前驱结点 } Node; void Prim( int map[][10], int num,Node *vertex) { for ( int i=0;i<num;i++) { vertex[i].shortdist=map[0][i]; vertex[i].flag= false ; if (map[0][i]<100) vertex[i].prev=0; //前驱结点设置为-1,表示无前驱 else vertex[i].prev=-1; } vertex[0].flag= true ; //vertex[0].prev=0; int prev=0; for ( int i=1;i<=num-1;i++) { int min=100; int position=-1; for ( int j=0;j<num;j++) //找到一个最短的 if (vertex[j].flag== false &&vertex[j].shortdist<min) { min=vertex[j].shortdist; position=j; } vertex[position].flag= true ; //vertex[position].prev= for ( int j=0;j<num;j++) //用新加入的节点更新 if (vertex[j].flag== false &&map[position][j]<vertex[j].shortdist) { vertex[j].shortdist=map[position][j]; vertex[j].prev=position; } } int sum=0; cout<< "1节点生成的最小生成树:" <<endl; for ( int i=0;i<num;i++) { cout<< "节点:" <<i+1<< " 最短距离: " <<vertex[i].shortdist<< " 前一个连接节点为: " <<vertex[i].prev+1<<endl; sum+=vertex[i].shortdist; } cout<< "总长度为:" <<sum; } int main() { int map[10][10],row,col; cin>>row>>col; if (row!=col) { cout<< "Wrong!" <<endl; return 0; } int num=row; Node *vertex= new Node[col]; for ( int i=0;i<num;i++) for ( int j=0;j<num;j++) cin>>map[i][j]; //节点间距离为0-99,100表示无穷远 Prim(map,num,vertex); return 0; } |
结果如下图:
态度决定高度,细节决定成败,
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步