今天细读了算法导论的21章不相交集合,也就是传说中的并查集,有点小收获。原来网上搜的并查集只介绍了路径压缩,今天第一次听说还有按秩合并这回事儿。算法导论上说,同时利用按秩合并和路径压缩技术处理,并查集的操作速度可以大大提升。设有一连串的make-set,find-set,union操作共m个,其中make-set有n个,在渐进意义上,这一连串的操作的时间复杂度为O(m*a(n)),a(n)是一个增长很慢的函数。具体证明不太懂,以后有时间再看。这里值得注意的一点就是union操作包含2个find-set操作和1个link操作。
再用并查集来分析一下kruskal算法,首先对于带权的边排序的效率为O(ElogE),make-set操作V次,union操作E次,因此总的时间复杂度为(V+E')a(V)+O(ElogE),a(v)=4,E'<V,总的复杂度可以简化为O(V+ElogE)=O(ElogE),换一种表示形式为O(ElogV),因为E<V*V
#include<iostream> #include<algorithm> using namespace std; class union_find_set { public: const static int maximum=1001; int anc; int father[maximum]; int count[maximum]; int rank[maximum]; union_find_set() { for(int i=0;i<maximum;i++) { this->father[i]=i; this->count[i]=1; this->rank[i]=0; } } int getFather(int v) { if(father[v]==v) { return v; } else { return father[v]=getFather(father[v]); } } bool same(int x,int y) { return (getFather(x)==getFather(y)); } bool judge(int x,int y) { int fx,fy; fx=getFather(x); fy=getFather(y); if(fx==fy) return false; else { if(rank[x]<rank[y]) { father[fx]=fy; count[fy]+=count[fx]; } else if(rank[x]>rank[y]) { father[fy]=fx; count[fx]+=count[fy]; } else { father[fx]=fy; count[fy]+=count[fx]; ++rank[fy]; } return true; } } void init(int max) { for(int i=0;i<=max;i++) { this->father[i]=i; this->count[i]=1; this->rank[i]=0; } } }; class node { public: int x,y,cost,flag; node() { flag=0; } }; int cmp(const void*a,const void*b) { node* A=(node*)a; node* B=(node*)b; if(A->cost>B->cost) return 1; if(A->cost<B->cost) return -1; return 0; } int main() { int n,m; while(cin>>n>>m) { node p[m]; for(int i=0;i<m;i++) { cin>>p[i].x>>p[i].y>>p[i].cost; } qsort(p,m,sizeof(p[0]),cmp); /*for(int i=0;i<m;i++) { cout<<p[i].x<<" "<<p[i].y<<" "<<p[i].cost<<endl; }*/ union_find_set ufset; ufset.init(n-1); int max=0; for(int i=0;i<m;i++) { if(ufset.judge(p[i].x,p[i].y)) { p[i].flag=1; if(p[i].cost>max) max=p[i].cost; } } cout<<max<<endl; cout<<n-1<<endl; for(int i=0;i<m;i++) { if(p[i].flag==1) cout<<p[i].x<<" "<<p[i].y<<endl; } } }
发表评论
-
图的割点tarjan---zoj_1119
2011-10-24 23:00 1236http://acm.zju.edu.cn/on ... -
BFS与双向BFS---zoj_1505
2011-10-09 17:14 1647http://acm.zju.edu.c ... -
静态treap+线段树---zoj_2112
2011-09-29 23:06 1712http://acm.zju.edu ... -
NIM博弈游戏,SG函数---zoj_3084,zoj_2083
2011-09-23 23:00 1322Nim游戏是两个人进行的游戏有如下规则: ... -
多重背包--zoj_2156
2011-09-14 11:10 867首先介绍经典的三种背包问题,0-1背包,完全 ... -
模式串匹配---KMP
2011-08-31 20:49 1282朴素的的模式串匹配算法通常要在向前移动文本指针 ... -
八数码问题(A*&&双向BFS)---zoj_1217
2011-08-30 22:13 1673题目地址:http://acm.zju.edu.cn/onli ... -
ac自动机以及它上面的DFA
2011-08-08 23:04 2483AC自动机(Aho-Corasick)主要用 ... -
二分图最大匹配(匈牙利算法)--zoj1516,1525,2223
2011-07-20 22:36 1190二分图G(E,V)将点集合V分成两个部分L,R ... -
网络最大流(EK)---zoj_1734
2011-07-19 16:34 2136网络最大流是图论中的一个典型问题,为了精确的定 ... -
trie和前缀检查---zoj_2876
2011-07-13 23:03 870trie树是一种多叉树,广泛用于字典检索。如 ... -
位图bitmap
2011-07-13 21:08 916bitmap是一种广泛使用的数据结构,主要用在 ... -
LAC和RMQ的转化---zoj_3195
2011-07-12 22:35 1078我擦。。纠结了好久啊,从SF到TLE,先总结2 ... -
LAC的tarjan(离线)算法---zoj_1141
2011-07-08 17:52 1662LCA就不解释了,这里主要再次复习一下LC ... -
笛卡尔树以及treap---zoj_2243
2011-07-07 15:52 2847zoj_2243笛卡 ... -
线段染色,矩形切割,离散化---zoj_2301,zoj_1128
2011-06-24 22:32 1369染色问题:在一维坐标轴上(最右端为M),有N ... -
线段树---zoj_1610
2011-06-22 21:06 755线段树是一种二叉树的拓展,在线段树每个节点中 ... -
快速排序(qsort)
2011-06-16 17:03 782快速排序是一种高效的非稳定排序,它的基本思路 ... -
斐波那契散列
2011-06-16 16:38 3083斐波那契散列法其实是一种特殊的乘法散列,先来看乘法 ... -
强连通分支(scc)---tarjan
2011-06-15 16:17 1285本文大量 ...
相关推荐
最小生成树kruskal算法并查集版 C语言实现 - Slyar Home
最小生成树kruskal算法并查集版+C语言实现
假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的...
编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。最小生成树能够选择图上的任意一点做根结点。最小生成树输出采用顶点集合和边的集合的形式。
最小生成树算法是基于贪心的思想得到的。包括Kruskal算法和Prim算法
最小生成树_kruskal
已知一连通网,求其最小生成树。算法用的是KRUSKAL(用快速排序进行优化),用到并查集。
该程序是我写的博客“一起talk C栗子吧(第五十回:C语言实例--最小生成树二)”的配套程序,共享给大家使用
代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树...
资源名:最小生成树_Kruskal_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有一定经验的...
代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal...
最小生成树kruskal算法 最小生成树kruskal算法
图论- 生成树- 最小生成树- Kruskal.rar
06最小生成树_Kruskal.c
matlab程序 最小生成树 matlab Kruskal 源代码
实现了kruskal的算法,测试可行。
利用krustra算法实现图的最小生成树
第3关求图(邻接矩阵存储)最小生成树的克鲁斯卡尔(Kruskal)算法 第4关求图(邻接表存储)最小生成树的克鲁斯卡尔(Kruskal)算法 稳过 生成树是将图中所有顶点以最少的边连通的子图。权值和最小的生成树就是最小...
我自己编写的一个C++ kruskal最小生成树程序,希望可以对初学者有所帮助,错误难以避免,希望大家谅解
最小生成树Kruskal算法[定义].pdf