Kruskal算法说明及图解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.无向网图及边集数组存储示意图
vertex[6]=
2.Kruskal 方法构造最小生成树的过程
(a)一个图 (b)最小生成树过程1
V0 V1 V2 V3 V4 V5
下标 0 1 2 3 4 5 6 7 8 from 1 2 0 2 3 4 0 3 0 to
4
3 5 5 5 5 1
4 2 weight 12
17
19
25
25
26
34
38
46
V1
V0
V4 V5
V2 V3
V1
V0 V5 V2 V3 V4
(c)最小生成树过程2 (d)最小生成树过程3
(e)最小生成树过程4 3.伪代码
1)初始化辅助数组parent[vertexNum];num=0; 2) 依次考查每一条边for(i=0; i parent[vex2]=vex1; num++; if(num==vertexNum-1) 算法结束 4.构造过程中参数变化 顶点集 数组 parent V0 V1 V2 V3 V4 V5 被考查边 输出 说明 初始化 parent -1 -1 -1 -1 -1 -1 6棵生成树,均只有根结点 parent -1 -1 -1 -1 1 -1 (v1,v4)12 (v1,v4)12 vex1=1,vex2=4;parent[4]=1; parent -1 -1 -1 2 1 -1 (v2,v3)17 (v2,v3)17 vex1=2,vex2=3;parent[3]=2; parent -1 -1 -1 2 1 0 (v0,v5)19 (v0,v5)19 vex1=0,vex2=5;parent[5]=0; parent 2 -1 -1 2 1 0 (v2,v5)25 (v2,v5)25 vex1=2,vex2=0;parent[0]=2; parent 2 -1 -1 2 1 0 (v3,v5)25 vex1=2,vex2=2;所在根结点相同 parent 2 -1 1 2 1 0 (v4,v6)26 (v4,v6)26 vex1=1,vex2=2;parent[2]=1; parent 2 -1 1 2 1 生成树根结点是v1 5.主要代码 /**********构造函数************/ template EdgeGraph { vertexNum=n; edgeNum=e; int i,j,weight; for (int k=0; k vertex[k]=a[k]; for (k=0; k { cout<<"输入边依附的两个顶点的编号:"; cin>>i>>j; edge[k].from=i; edge[k].to=j; cout<<"请输入权重:"; cin>>weight; edge[k].weight=weight; } } /**********Kruskal算法构造最小生成树************/ template void EdgeGraph { int num; int parent[MaxVertex], vex1, vex2; for (int i=0; i parent[i]=-1; for (i=0,num=0; i { vex1=FindRoot(parent, edge[i].from); vex2=FindRoot(parent, edge[i].to); if (vex1!=vex2) { cout << "(" << edge[i].from <<"->"< parent[vex2]=vex1; num++; if (num==vertexNum-1) return; } } } /**********寻找根节点************/ template int EdgeGraph { int t=v; while(parent[t] > -1) t=parent[t]; return t; } /**********遍历输出************/ template void EdgeGraph { for (int i=0; i { cout<<"("< "< } } 6.结果截图 发现不按大小输入weight的值则不能正确生成最小生成树如排好序输入时则得到正确的最小生成树