贪心算法-最小生成树
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; }
结果如下图:
态度决定高度,细节决定成败,