最小生成树(一)....Prme算法

来源:互联网 发布:淘宝风筝 编辑:程序博客网 时间:2024/06/05 19:16


Prime 算法

     简单定义一下Prime算法                                                                                                                       Prime算法其实是不断的想一个集合(设为S)里加点。                                                                                     最开始这个集合S里只有一个点,然后寻找集合S中的点与剩下点之间最短的边,加入这个集合,然后再找最短边,直到S有n个点

/*
    typedef struct{
      int flag,len; 
    }CloseEdge;
     上述结构体定义了MST集合与剩下点之间的距离

    算法:
    init(CloseEdge);  //初始化CloseEdge,即选一个点为开始点(记为V0),然后flag = 0 表示这个点在集合里,len为V0到其的距离 
    for(int cnt=0;cnt<n-1;++cnt){   //当集合S有n个点时结束,开始时已有一个,所以只需n-1次循环
        int m_pos = Find_min(CloseEdge);  //寻找集合与剩下点之间的最短边,即CloseEdge中的最小值
        CloseEdge[m_pos].flag = 0;       // 将找到的点标记为已在集合中
        Update(CloseEdge);               //跟新CloseEdge,由于新加了点,所以最短边可能变化。
    }
*/

下面是Code,如有错误,欢迎指正。。

/*    Prime算法    typedef struct{   int flag,len;    //flag  sign whether the Edge is in the M_Tree.  len is the minimun length from M_Tree to the rest vertexs.}CloseEdge;init(CloseEdge); //initialization. All the flags equal 1 that denotes the edge isn't in the set.    for(int cnt=0;cnt<n-1;++cnt){int m_pos = Find_min(CloseEdge);CloseEdge[m_pos].flag = 0;Update(CloseEdge);}*/#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define MAX 200  // denote the maximun number of the vertexs#define INF ~(1<<31)struct CloseEdge{    int x,y,len,flag;};CloseEdge E[MAX];int len=0,ans=0,g[MAX][MAX];void init(CloseEdge *E,int n);int Find_min(CloseEdge *E,int n);void Update(CloseEdge *E,int n,int pos);void initG(int n){    for(int i=0;i<n;++i)        for(int j=0;j<n;++j)            g[i][j] = INF;}int main(){    int n;    while(cin>>n){        initG(n);        for(int i=0;i<n;++i)            for(int j=0;j<n;++j)                cin>>g[i][j];        init(E,n);        for(int j=0;j<n-1;++j){            int m_pos = Find_min(E,n);            ans += E[m_pos].len;            E[m_pos].flag = 0 , E[m_pos].len = 0;            Update(E,n,m_pos);        }        cout<<ans<<endl;    }    return 0;}void init(CloseEdge *E,int n){    E[0].flag = 0,E[0].len=0;    for(int i=1;i<n;++i){        E[i].flag = 1;        E[i].len = g[0][i];    }}int Find_min(CloseEdge *E,int n){    int min_len = INF, m_pos = 0;    for(int i=1;i<n;++i){        if(E[i].flag && E[i].len < min_len){            min_len = E[i].len;            m_pos = i;        }    }    return m_pos;}void Update(CloseEdge *E,int n,int pos){    for(int i=1;i<n;++i){        if(E[i].flag && g[i][pos] < E[i].len)            E[i].len = g[i][pos];    }}


0 0