贪心算法-最小生成树

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

结果如下图:

  

posted @ 2013-04-20 23:23  再见,少年  Views(240)  Comments(0Edit  收藏  举报