小生成树并查集最短路.ppt
《小生成树并查集最短路.ppt》由会员分享,可在线阅读,更多相关《小生成树并查集最短路.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、最小生成树最小生成树 并查集并查集 最短路最短路罗方炜最小生成树最小生成树问题描述:问题描述:某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。最小生成树最小生成树输入:输入:测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N(100);随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。当N为0时,输入结束,该用例
2、不被处理。输出:输出:对每个测试用例,在1行里输出最小的公路总长度。最小生成树最小生成树样例输入:样例输入:3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0 样例输出:样例输出:35最小生成树最小生成树最小生成树:最小生成树:在一个具有几个顶点的连通图G中,如果存在子图G包含G中所有顶点和一部分边,且不形成回路,则称G为图G的生成树,代价最小生成树则称为最小生成树。简称MST。最小生成树最小生成树一般有两种算法:一般有两种算法:Prim和Kruskal算法 今天主要讲Kruskal算法,适用本题,给出的边数,复杂度elong
3、(e)(其中e表示变数)最小生成树最小生成树算法粗略描述:算法粗略描述:假设 WN=(V,E)是一个含有 n 个顶点的连通网,先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集从网的边集 E 中选取一条权值最小的边中选取一条权值最小的边,若该条边的两个顶点分属不同的树分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止条边为止。最
4、小生成树最小生成树做法做法:定义结点:定义结点:#define M 10005struct nodeint x,y,w;/表示x到y需要花费weM;int n,m,fatherM;/n定点数量,m边数量,fatherM,每个定点所属集合最小生成树最小生成树int kruskal()int res=0,k=1,j=0;for(int i=1;i=m;i+)fatheri=i;/初始化集合数组while(kn&jm)/需要n-1条边int m1=ej.x,m2=ej.y;int sn1=findroot(m1),sn2=findroot(m2);If(sn1!=sn2)res+=ej.w;k+;/
5、生成数+1unionset(sn1,sn2);j+;if(k!=n)res=-1;/不可能的情况,产生不了最小生成树return res;最小生成树最小生成树int main()while(scanf(%d,&n)&n)m=n*(n-1)/2;for(int i=0;im;i+)scanf(%d%d%d,&ei.x,&ei.y,&ei.w);sort(e,e+m,cmp);/排序按边权w值从小到大排序 printf(%dn,kruskal();最小生成树最小生成树整体思想已经完成,但是可以看到第二部分红色字体标出的代码:sn1=findroot(m1),sn2=findroot(m2);uni
6、onset(sn1,sn2);这部分涉及到了集合操作,也就是我这部分涉及到了集合操作,也就是我们马上要讲的们马上要讲的并查集并查集并查集并查集英文:Disjoint Set,即“不相交集合”将编号分别为1N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素代表所在集合。常见两种操作:n合并并两个集合n查查找某元素属于哪个集合所以,也称为“并查集”并查集并查集n用编号最小的元素标记所在集合;n定义一个数组 set1.n,其中seti 表示元素i 所在的集合;123456789101214261622iSet(i)不相交集合:1,3,7,4,2,5,9,10,6,8并查集并查集find1(
7、x)return setx;Merge1(a,b)i=min(a,b);j=max(a,b);for(k=1;k=N;k+)if(setk=j)setk=i;(1)(N)并查集并查集n对于“合并操作”,必须搜索全部元素!n树结构如何?并查集并查集n每个集合用一棵“有根树”表示n定义数组 set1.nnseti=i,则i表示本集合,并是集合对应树的根nseti=j,ji,则 j 是 i 的父节点.123456789101232134334iSet(i)15247103689并查集并查集find2(x)r=x;while(setr!=r)r=setr;return r;merge2(a,b)if(
8、ab)setb=a;else seta=b;(1)最坏情况(N)一般情况是?并查集并查集n性能有本质改进?n如何避免最坏情况?并查集并查集n方法:将深度小的树合并到深度大的树n实现:假设两棵树的深度分别为h1和h2,则合并后的树的高度h是:nmax(h1,h2),if h1h2.nh1+1,if h1=h2.n效果:任意顺序的合并操作以后,包含k个节点的树的最大高度不超过并查集并查集merge3(a,b)if(height(a)=height(b)height(a)=height(a)+1;setb=a;else if(height(a)height(b)seta=b;else setb=a;
9、find2(x)r=x;while(setr!=r)r=setr;return r;最坏情况(log N)(1)并查集并查集n思想:每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快(路径压缩路径压缩)n步骤:n第一步,找到根结点n第二步,修改查找路径上的所有节点,将它们都指向根结点并查集并查集nfind3(x)nn r=x;n while(setr r)/循环结束,则找到根节点n r=setr;n i=x;n while(i r)/本循环修改查找路径中所有节点n n j=seti;n seti=r;n i=j;n 并查集并查集910812202116461116411110
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小生 查集最 短路
限制150内