4克鲁斯卡尔算法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6)…依据上述规则,不断选入点对,对于有 N 个顶点的图,选 N-1 个点对(N-1 条边)即可
总结:点对入选规则 1)不是子集且无交集,入选; 2)有交集,入选;合并相关集合;3)是子集, 不入选。
从程序的观点看: 可以使用数组 Vertex[]作为集合来描述顶点选入情况。Vertex[]的下标为顶点 编号,值为该顶点是否被选。例 Vertex[1]=0,表示顶点 1 不在集合中;Vertex[1] ≠0 表示顶点 1 在集合中。另外还需要一个集合编号,对应上述步骤,Vertex 的值为:if(vertex[v1]==vertex[v3]==0) 1)Vertex[]={0,1,0,1,0,0,0} 下标——顶点编号,子集—编号 1 2)Vertex[]={0,1,0,1,2,0,2} 3)Vertex[]={0,1,3,1,2,3,2} if(Vertex[v3v6]!=0,且不相等 合并
4)点对(3,6)进入集合 Vertex={ {1,3},{4,6},{2,5},{3,6} },点 对(3,6)与两个集合{1,3},{4,6}有交集,这时需要将它们变为一个集 合,即进行集合并运算。最后集合变为 Vertex={ {1,3,4,6},{ቤተ መጻሕፍቲ ባይዱ,5} }, 将对应的边选入线性表。
5)点对(1,4)不能进入集合,因为它是集合 Vertex 的子集,点对(1,4)的 边会使生成树构成回路。
{ LA. VEdge[n].vtx1=I;
LA. VEdge[n].vtx1=j;
LA. VEdge[n].length= gdata[i][j]
LA.count++
}
}
对 LA 排序
Int k=0 -指向 LA 头部+1
Int m=1 集合标号
第一条边进入(1,3)
Vertex[N ]={ 0,1,0,1,0,0,0})
Vertex[N ]={ 0,0,0,0,0,0,0})
int gData[][N]={ { 0,0,0,0,0,0,0},
;
sVEList LA={0},LB={0};
原始数据读入 LA 中
Int n=0;
For(i=1;i<=6;i++)
For(j=1;j<=6;j++)
{
if(gdata[i][j] && i<j)
相关集合) 4)Vertex[]={0,1,3,1,1,3,1} 相等且不为零 是子集,不入选 ……
typedef struct {
int vtx1; //点对与边长 int vtx2; int length; } dataSet;
typedef struct {
dataSet VEdge[50]; int count; } sVEList, *LPListVE;
用 C++写 按照流程图来写 还有老师给了一部分的代码
4 克鲁斯卡尔算法—集合运算应用
上图表述了生成树的算法过程 (选最短边,不构成回路) 只要有交集就合并 “原图”的数据对象可以使用邻接表来表达: IntgData[7][7] “边长排序图”的数据可以用线性表保存,数据结构: 算法描术: 算法过程,本质上是集合操作,集合的初始状态是空集,然后:
1)点对(1,3)进入集合 Vertex[ ]={ {1,3} } 集合里有一个子集,将对 应的边选入线性表( Vertex[7 ]={ 0,0,0,0,0,0,0})
2) 点对(4,6)进入集合 Vertex={ {1,3},{4,6} } 集合里有两个子集, 将对应的边选入线性表。
3)点对(2,5)进入集合 Vertex={ {1,3},{4,6},{2,5} } 集合里有三 个子集,将对应的边选入线性表。
第一条边信息进入 LB={0}
Vertex[N ]={ 0,1,0,1,2,0,2}) { Vertex[x1]== Vertex[x2]==0}
(通过 m++实现)
第 2 条边信息进入 LB={0}
相关文档
最新文档