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


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章