贪心算法-最小生成树
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;
}
结果如下图:

态度决定高度,细节决定成败,

浙公网安备 33010602011771号