西安电子科技大学离散数学大作业Word文档下载推荐.docx
- 文档编号:15338526
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:18
- 大小:176.74KB
西安电子科技大学离散数学大作业Word文档下载推荐.docx
《西安电子科技大学离散数学大作业Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《西安电子科技大学离散数学大作业Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
最小生成树
一、最小生成树的研究进展
最小生成树可以使用Kruskal算法和Prim算法。
下面具体介绍这两种算法。
Kruskal算法
求加权连通图的最小生成树的算法。
kruskal算法总共选择n-1条边,(共n条边)所使用的贪婪准则是:
从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。
注意到所选取的边若产生环路则不可能形成一棵生成树。
kruskal算法分e步,其中e是网络中边的数目。
按耗费递增的顺序来考虑这e条边,每次考虑一条边。
当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。
该算法的时间复杂度为O(elge);
Kruskal算法的时间主要取决于边数,它较适合于稀疏图。
Kruskal算法构造最小生成树的过程图解:
Prim算法
Prim算法可以说是所有MST算法中最简单的,比较适用于稠密图。
以图中任意一个顶点S开始,选择与之相关连的边中权值最小的边加入到MST中,假设这条边的终点为T,则MST初始化为(S,T),称之为“当前MST”。
接下来在剩余的边中选择与当前MST中s所有顶点相关连的边中权值最小的边,并添加到当前MST中。
这一过程一直迭代到图中所有顶点都添加到MST中为止。
从连通网络N={V,E}中的某一顶点u0出发,选择与它关联的具有最小权值的边(u0,v),将其顶点加入到生成树的顶点集合U中。
以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把该边加入到生成树的边集TE中,把它的顶点加入到集合U中。
如此重复执行,直到网络中的所有顶点都加入到生成树顶点集合U中为止。
假设G=(V,E)是一个具有n个顶点的带权无向连通图,T(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集。
prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图。
二、最小生成树的实现
Kruskal算法关键部分的实现
Kruskal算法的计算流程大致如下:
1.将无向图的边按距离长短递增式排序,放到集合中
2.遍历该集合,找出最短的边,加入到结果生成树的集合中
3.如果结果生成树出现回路,则放弃这条边
4.重新执行步骤2,直至所有顶点被遍历
可以看出在每次遍历过程中采用了贪心算法
Kruskal算法代码如下:
//**********************最小生成树kruscal算法*******************
intacrvisited[100];
//kruscal弧标记数组
intfind(intacrvisited[],intf)
{
while(acrvisited[f]>
0)
f=acrvisited[f];
returnf;
}
voidkruscal_arc(MGraph_LG,algraphgra)
edgedgs[20];
inti,j,k=0;
for(i=0;
i!
=G.vexnum;
++i)
for(j=i;
j!
++j)
if(G.arcs[i][j].adj!
=10000)
{
edgs[k].pre=i;
edgs[k].bak=j;
edgs[k].weight=G.arcs[i][j].adj;
++k;
}
intx,y,m,n;
intbuf,edf;
=gra.arcnum;
acrvisited[i]=0;
for(j=0;
=G.arcnum;
m=10000;
if(edgs[i].weight<
m)
m=edgs[i].weight;
x=edgs[i].pre;
y=edgs[i].bak;
n=i;
buf=find(acrvisited,x);
edf=find(acrvisited,y);
edgs[n].weight=10000;
if(buf!
=edf)
acrvisited[buf]=edf;
cout<
<
"
("
x<
"
y<
)"
m;
endl;
//**************************************************************
Prim算法关键部分的实现
Prim算法的计算流程大致如:
(1)初始状态,TE为空,U={v0},v0∈V;
(2)在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u′,v′)并入TE,同时将v′并入U;
重复执行步骤
(2)n-1次,直到U=V为止。
Prim算法代码如下:
//**********************最小生成树PRIM算法*******************
typedefstruct
intadjvex;
intlowcost;
}closedge;
intprim(intg[][max],intn)//最小生成树PRIM算法
intlowcost[max],prevex[max];
//LOWCOST[]存储当前集合U分别到剩余结点的最短路径
//prevex[]存储最短路径在U中的结点
inti,j,k,min;
for(i=2;
i<
=n;
i++)//n个顶点,n-1条边
lowcost[i]=g[1][i];
//初始化
prevex[i]=1;
//顶点未加入到最小生成树中
lowcost[1]=0;
//标志顶点1加入U集合
i++)//形成n-1条边的生成树
min=inf;
k=0;
for(j=2;
j<
j++)//寻找满足边的一个顶点在U,另一个顶点在V的最小边
if((lowcost[j]<
min)&
&
(lowcost[j]!
=0))
min=lowcost[j];
k=j;
printf("
(%d,%d)%d\t"
prevex[k]-1,k-1,min);
lowcost[k]=0;
//顶点k加入U
j++)//修改由顶点k到其他顶点边的权值
if(g[k][j]<
lowcost[j])
lowcost[j]=g[k][j];
prevex[j]=k;
\n"
);
return0;
三、代码
#include<
stdio.h>
#include<
iostream>
malloc.h>
usingnamespacestd;
#defineint_max10000
#defineinf9999
#definemax20
//**********************邻接矩阵定义*************************
typedefstructArcCell
intadj;
char*info;
}ArcCell,AdjMatrix[max][max];
charvexs[max];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph_L;
//***********************************************************
intlocalvex(MGraph_LG,charv)//返回V的位置
inti=0;
while(G.vexs[i]!
=v)
++i;
returni;
intcreatMGraph_L(MGraph_L&
G)//创建图用邻接矩阵表示
charv1,v2;
inti,j,w;
cout<
请输入图的顶点和弧的个数:
例如46(4表示顶点的个数,5表示弧的个数)"
cin>
>
G.vexnum>
G.arcnum;
输入顶点"
G.vexs[i];
G.arcs[i][j].adj=int_max;
G.arcs[i][j].info=NULL;
for(intk=0;
k!
++k)
输入一条边依附的顶点和权:
例如abc(a,b表示顶点,c表示权)"
cin>
v1>
v2>
w;
//输入一条边依附的两点及权值
i=localvex(G,v1);
//确定顶点V1和V2在图中的位置
j=localvex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[j][i].adj=w;
图G邻接矩阵创建成功!
returnG.vexnum;
intvisited[max];
//访问标记
intwe;
typedefstructarcnode//弧结点
//该弧指向的顶点的位置
structarcnode*nextarc;
//弧尾相同的下一条弧
//该弧信息
}arcnode;
typedefstructvnode//邻接链表顶点头接点
chardata;
//结点信息
arcnode*firstarc;
//指向第一条依附该结点的弧的指针
}vnode,adjlist;
typedefstruct//图的定义
adjlistvertices[max];
intkind;
}algraph;
typedefstructacr
intpre;
//弧的一结点
intbak;
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安电子科技大学 离散数学 作业