并查集&最小(最大)生成树
2017-07-28 10:12
169 查看
首先给出并查集基本代码:
最小生成树个人比较喜欢Kruskal算法:
上面使用了sort(),可以根据题目要求(最大还是最小)自定义比较函数:
[b]下面是模板:
从小到大排列(返回为真,左值优先)
若为最大生成树把小于换成大于即可
亦可在函数体内重载小于号操作符:
注意:在结构体内重载小于号操作符后,同时完成了== 操作符,无需再次重载,但需要用到比较函数时,不能先重载==和!=等操作符,必须支持<操作符
int fa[maxn],rank[maxn]; //基础数组,fa数组保存上一个节点,rank表示节点级数(比较少用)
//初始化 void init(int n){ for(int i=1;i<=n;i++){ fa[i]=i; rank[i]=0; } }
//查找 int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } void Combine(int a,int b){ a=find(a); b=find(b); if(a==b) return ; if(rank[a]>rank) fa[b]=a; else{ fa[a]=b; if(rank[a]==rank[b]) ++rank[b]; } }
//判断 bool issame(int a,int b){ return find(a)==find(b); }
最小生成树个人比较喜欢Kruskal算法:
int Kruskal( ) { sort(eg,eg+n,cmp); // 并查集 初始化 Init(m); // 构建最小生成树 int res=0; for(int i=1;i<=edgeNum;++i ) { e=eg[i]; if( Find(e.u)!=Find(e.v) ) { Combine(e.u,e.v); res+=e.cost; } } return res; }
上面使用了sort(),可以根据题目要求(最大还是最小)自定义比较函数:
[b]下面是模板:
从小到大排列(返回为真,左值优先)
若为最大生成树把小于换成大于即可
bool cmp1(const edge& a,const edge& b){ return a.cost<b.cost; }
亦可在函数体内重载小于号操作符:
注意:在结构体内重载小于号操作符后,同时完成了== 操作符,无需再次重载,但需要用到比较函数时,不能先重载==和!=等操作符,必须支持<操作符
bool operator < (const edge &b)const{ return cost<b.cost; }
相关文章推荐
- LightOJ -1029--Civil and Evil Engineer(最小生成树&&最大生成树)
- hdu 4786 最小生成树与最大生成树
- Spark组件之GraphX学习7--随机图生成和reduce最大或最小出度/入度/度
- POJ 2485 Highways【最小生成树最大权——简单模板】
- Prim最小生成树(求,生成树中权值的和,最大权值,最小权值) 参考poj1258 2485
- poj Kruskal 【poj3723 Conscription : 最大生成树;poj 1251 Jungle Roads: 最小生成树poj1861Network】
- POJ2485 求最小生成树的最大边长度
- POJ2485 Highways 最小生成树的最大边
- 最小生成树(poj1797)路径最小值最大
- 通过随机数生成办法,向int num[10][10]的数组 中存入数据并找出数组的最大、最小值及其下标。
- 省选集训 airplane 并查集&&最小生成树
- Out of Hay(最小生成树的最大权)
- hdu 4786 最小生成树与最大生成树
- POJ 2485 Highways【最小生成树最大边,Prime算法】
- [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)
- 最小生成树的最大边poj2395
- hdoj 4786 Fibonacci Tree 【最小生成树&&最大生成树】
- POJ3723 Conscription , 最大权森林问题 ->最小生成树问题
- bzoj2561: 最小生成树 最大流
- POJ 2485 Highways【最小生成树最大权——简单模板】