最小生成树(一)....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,如有错误,欢迎指正。。
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]; } }
简单定义一下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]; } }
相关文章推荐
- 高级算法设计讲义 Lecture Notes for Advanced Algorithm Design
- 用 Scrapy+Mariadb 实现汉典数据爬虫(二)——Scrapy简单介绍
- 据说是1984年理科高考数学附加题及圆弧符号LaTeX输入法
- 《计算复杂性》课件
- [javaSE] 集合框架(Map概述)
- 1098. Insertion or Heap Sort
- NAND flash和NOR flash的区别详解
- 使用SSH传输文件/文件夹
- PL/SQL Developer 如何显示行号
- Python学习
- (二)javascript的数据类型
- 嵌入式C语言程序存储特点
- lsof
- 全球知名大学课件下载地址汇总
- DevExpress的GridControl的实时加载数据解决方案(取代分页)
- 319. Bulb Switcher
- 欢迎使用CSDN-markdown编辑器
- 大学毕业4年-回顾和总结(10)-文档化战略,执行最成功的战略,堪比我人生中的“隆中对”(战略在前,成果在后)
- 大学毕业4年-回顾和总结(10)-文档化战略,执行最成功的战略,堪比我人生中的“隆中对”(战略在前,成果在后)
- 大学毕业4年-回顾和总结(10)-文档化战略,执行最成功的战略,堪比我人生中的“隆中对”(战略在前,成果在后)