最小生成树问题学习总结
2016-12-04 00:37
375 查看
kruskal算法思想:
对图中的所有边按升序排列,依次检验图中的权值最小的边,若此边加入后不形成回路,则选取此边加入生成树,直至选取n-1条边。
算法实现:
对图的信息中所需数据元素只有边的两端顶点及权值,选取的生成树的边存储结构与之相同。
是否形成回路的判断需要用到待选边表,这里用vset数组,若两顶点在同一集合中(vset[i]==vset[j]),则不能选取边L<i,j>,不然会形成回路。
这里推荐MOOC中国大学网上的--解放军理工大学的数据结构课程,讲解特别详细。
prim算法
//最小生成树之prim算法
#include <iostream>
using namespace std;
const int M=100;
struct edgenode
{
int incrvert,vertex;
int weight;
};
void prim(int G[M][M],int n)
{
int v,i,j,k;
edgenode t,wait[M-1];//wait为待选边表
for(v=0;v<n-1;n++)//以数组标号0的顶点为初始生长点初始化待选边表
{
wait[v].incrvert=0;
wait[v].vertex=v+1;
wait[v].weight=G[0][v+1];
}
for(i=0;i<n-2;i++)
{
k=i;
for(j=i+1;j<n-1;j++)
{
if(wait[j].weight<wait[k].weight)
k=j;
t=wait[k];
wait[k]=wait[i];
wait[i]=t;
v=wait[i].vertex;
for(j=i+1;j<n-1;j++)
if(wait[j].weight>G[v][wait[j].vertex])
{
wait[j].weight=G[v][wait[j].vertex];
wait[j].incrvert=v;
}
}
for(i=0;i<n-1;i++)
cout<<wait[i].vertex<<wait[i].incrvert<<wait[i].weight;
}
对图中的所有边按升序排列,依次检验图中的权值最小的边,若此边加入后不形成回路,则选取此边加入生成树,直至选取n-1条边。
算法实现:
对图的信息中所需数据元素只有边的两端顶点及权值,选取的生成树的边存储结构与之相同。
是否形成回路的判断需要用到待选边表,这里用vset数组,若两顶点在同一集合中(vset[i]==vset[j]),则不能选取边L<i,j>,不然会形成回路。
这里推荐MOOC中国大学网上的--解放军理工大学的数据结构课程,讲解特别详细。
#include <iostream> #include <algorithm> using namespace std; struct linknode { int vex1,vex2; int weight; }; struct elgraph { int vexnum,edgenum; }; linknode *kruskal_MST(elgraph *G) { linknode *edgelist=new linknode[G->edgenum];//这里是输入G图中的都有边 for(int i=0;i<G->edgenum;i++) cin>>edgelist[i].vex1>>edgelist[i].vex2>>edgelist[i].weight; linknode *TE=new linknode[G->vexnum-1];//TE数组存放最小生成树的边 int j,k,v,s1,s2; int *vset=new int[G->vexnum];//用待选边表vset来判断是否形成回路 int w; for(j=0;j<G->vexnum;j++)//vset初始化 vset[j]=j; sort(edgelist[0],edgelist[G->edgenum+1]);//按照权值大小给图中的边排序 j=0;k=0;//k表示遍历的顶点数,j表示遍历的边的数目 while(k<G->vexnum-1&&j<G->edgenum) { s1=vset[edgelist[j].vex1]; s2=vset[edgelist[j].vex2]; if(s1!=s2)//生成树中加入边L<s1,s2>后不会生成回路 { TE[k].vex1=edgelist[j].vex1;//加入此边 TE[k].vex2=edgelist[j].vex2; TE[k].weight=edgelist[j].weight; k++; for(v=0;v<G->vexnum;v++)//修改待选边表 if(vset[v]==s2) vset[v]=s1; } j++; } return TE; }
prim算法
//最小生成树之prim算法
#include <iostream>
using namespace std;
const int M=100;
struct edgenode
{
int incrvert,vertex;
int weight;
};
void prim(int G[M][M],int n)
{
int v,i,j,k;
edgenode t,wait[M-1];//wait为待选边表
for(v=0;v<n-1;n++)//以数组标号0的顶点为初始生长点初始化待选边表
{
wait[v].incrvert=0;
wait[v].vertex=v+1;
wait[v].weight=G[0][v+1];
}
for(i=0;i<n-2;i++)
{
k=i;
for(j=i+1;j<n-1;j++)
{
if(wait[j].weight<wait[k].weight)
k=j;
t=wait[k];
wait[k]=wait[i];
wait[i]=t;
v=wait[i].vertex;
for(j=i+1;j<n-1;j++)
if(wait[j].weight>G[v][wait[j].vertex])
{
wait[j].weight=G[v][wait[j].vertex];
wait[j].incrvert=v;
}
}
for(i=0;i<n-1;i++)
cout<<wait[i].vertex<<wait[i].incrvert<<wait[i].weight;
}
相关文章推荐
- 最小生成树(Kruskal算法并查集优化)学习总结
- 极限元算法专家:深度学习在语音生成问题上的典型应用 | 学术分享会总结文
- 最小生成树学习总结
- 最小生成树学习总结
- 最小生成树之Prim算法的学习心得与个人总结
- 最小生成树问题(——模板习题与总结)
- 图论中最小生成树的问题学习
- [项目过程中所遇到的各种问题记录]学习篇——对工作以来的学习过的开源项目进行总结—动软代码生成工具
- 《算法导论》学习总结 — XX.第23章 最小生成树
- 利用递推法求最小数生成问题,求阶乘问题
- 07年 oo学习总结:一、系统软件架构-各层的生成
- Oracle字符集问题整理 (学习心得与网摘总结)
- 关于数组中最小两数差的学习总结
- 学习 Oracle过程中几个常见问题的总结
- ORA-16038、ORA-19809、ORA-00312问题的学习总结
- wss4j+xfire+spring 学习总结三(密钥生成和配置)
- 最小生成树问题
- Prim 最小生成树总结
- 这两天学习中的问题简单总结
- 学习PHP的问题总结