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