最小生成树(一)....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];
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值