《避圈法求最小生成树例题.docx》由会员分享,可在线阅读,更多相关《避圈法求最小生成树例题.docx(3页珍藏版)》请在优知文库上搜索。
1、避圈法求最小生成树例题避圈法是一种求解最小生成树的算法,它适用于不连通图。在不连通图中,我们需要在所有顶点之间构建虚拟边,以便将它们连成一个环。然后我们从环中删除一些边,这样最终剩下的边将形成最小生成树。以下是一个使用避圈法求解最小生成树的例题:给定一个n个顶点的无向连通图,其中顶点编号为O到n-lo要求将这个图改造成一个没有边相邻的图,使得改造后的图的权值之和最小。请输出改造后图的权值之和。输入格式:输入的第一行包含一个整数n(2n1000),表示图中的顶点数。接下来的n-1行,每行包含两个整数U和V(0u,Vn-l,uv),表示顶点U和顶点V之间有一条边。输出格式:输出一个整数,表示改造后
2、图的权值之和。示例:输入:4011 22 33 0输出:16解题思路:1 .初始化虚拟源点s和虚拟汇点to2 .对于每个顶点,计算从顶点到虚拟源点的距离distu3 .对于每个顶点,计算从顶点到虚拟汇点的距离distv4 .对于每个顶点,遍历虚拟边,尝试将顶点u和顶点V连接起来。如果此时构建了环,则不需要将虚拟边加入最小生成树。5 .如果遍历虚拟边后没有构建环,则将顶点u和顶点V连接起来的边加入最小生成树,并更新虚拟边的权值为Oo6 .最终最小生成树的权值之和即为改造后图的权值之和o代码实现(PythOn):defminspanningtree(G,s,t,dist):n-Ien(G)pare
3、nt=-1*nmincost=0min_dist=float(,inf,)foruinrange(n):min_cost+=Gusmindist=min(mindist,distu)parentu=useen=setOdeffind(u):ifparentu!=-1:parentu=find(parentu)returnparentudefunion(u,v):ifdistu+Guvdistv:distv=distu+Guvparentv二Udefmain():n=int(input()G=list(map(int,inputO.split()for_inrange(n)s=G00t=Gn-10dist=float(,inf,)*(n+1)dists=0min_spanning_tree(G,s,t,dist)cost=0foru,vinzip(G:-l,Gl:):cost+=Guvprint(cost)inamemain()_main_:注意:本例题中,我们假设图是连通的。如果不连通,需要在代码中处理。