您的位置:首页 > 其它

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

2016-06-09 17:14 351 查看
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,如有错误,欢迎指正。。

<pre name="code" class="cpp"><pre name="code" class="cpp">    #include<iostream>
using namespace std;
#define MAX 200  // denote the maximun number of the vertexs
#define INF ~(1<<31)
 
<span style="font-family: Arial, Helvetica, sans-serif;">        struct CloseEdge{</span>
int 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]; } }

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: