- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
无向图的连通分量和生成树 求无向图的连通分量: 对无向图G调用一次DFS过程,能访问完G的一个连通分量。因此对DFS算法稍做修改就可解决求无向图连通分量的问题。 举例:打印无向图的连通分量 int count=0; //count是连通分量个数计数器, 它是全局变量 void DFSTraverse(Graph G) { for(v=0; vG.vexnum; v++) visited[v]=False; //初始化 for(v=0; vG.vexnum; v++) if(!visited[v] ){ count++; DFS(G,v); } printf(“图G有%d个连通分量”,count); for(i=1; i=count; i++ ){ //分别打印每个连通分量的顶点 printf(“第%d个连通分量:”, i); for(j=0; jG.vexnum; j++) if(visited[j]==i) printf(GetVex(G, j)); printf(“\n”); } } void DFS(Graph G, int v) { visited[v]=count; //用visited[ ]记录每个顶点所属的连通分量的编号 for(w=FirstAdjVex(G,v);w!=-1; w=NextAdjVex(G,v,w)) if(!visited[w]) DFS(G, w); } 连通图的DFS生成树: 在对图做DFS遍历时,从一个已访问的顶点出发,到达一个未被访问的顶点所经历的边集及所有顶点构成的生成树。 void DFSForest(Graph G, CSTree T) { //构造DFS森林 T=NULL; for(v=0; vG.vexnum; v++) visited[v]=FALSE; for(v=0; vG.vexnum; v++) if(!visited[v]) { p=(CSTree)malloc(sizeof(CSNode));//构造树根结点 p-data=GetVex(G,v); p-firstchild=p-nextsibling=NULL ; if(!T) T=p; //第一棵生成树的根成为森林二叉树的根 else q-nextsibling=p; q=p; DFSTree(G,v,p); } } //end DFSForest void DFSTree(Graph G, int v, CSTree T) { visited[v]=True; //打上访问标记 first=True; //first为长子的标志 for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w)) if(!visited[w]){ p=(CSTree)malloc(sizeof(CSNode)); p-data=GetVex(G,v); p-firstchild=p-nextsibling=NULL; if(first){T-firstchild=p; first=False;} else q-nextsibling=p; q=p; DFSTree(G,w,q) } } //endDFSTree 连通图的BFS生成树: 在对图做BFS遍历时,从一个已访问的顶点出发,到达一个未被访问的顶点所经历的边集及所有顶点构成的生成树。 §7.4 连通网的最小代价生成树 最小生成树 最小(代价)生成树:无向网的所有生成树中,边权之和最小的生成树。 构造最小生成树的著名算法: Prim算法 Kruskal算法 在n个城市之间建通讯网; 可能的线路最多有n(n-1)/2条; 从中选择n-1条,满足: (1)连通; (2)边上权值之和为最小。 这就是构造最小代价生成树。 最小生成树的MST性质: 设G=(V, E)是一个连通网,U是顶点V的一个非空子集。若(u, v)是一条具有最小权值的边,且u∈U集,v∈V-U集,则必存在一棵包含边(u, v)
原创力文档


文档评论(0)