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