算法-并查集
2016-02-23 21:50
176 查看
并查集Union Find
简单地数据结构很实用的数据结构
UF
class UF{ public: explicit UF(int number); int find(int x); bool connected(int x, int y); void unions(int x, int y); private: vector<int> id; vector<int> rank; } UF::UF(int number){ id.resize(number); iota(id.begin(),id.end(),0); rank.resize(number,1); } int UF::find(int x){ while(id[x]!=x) x=find(id[x]); return id[x]; } //iterative /* int UF::find(int x){ while(id[x]!=x){ id[x]=id[id[x]]; x=id[x]; } return id[x]; }*/ bool UF:: connected(int x,int y){ return find(x)==find(y); } void UF::unions(int x, int y){ int root1=find(x); int root2=find(y); if(root1==root2) return; if(rank[root1]<rank[root2]){ id[root1]=root2; rank[root2]+=rank[root1]; }else{ id[root2]=id[root1]; rank[root1]+=rank[root2]; } }
Number of Connected Components in an Undirected Graph
并查集的直接应用int countComponents(int n,vector<pair<int, int>>& edges){ int cnt=0; UF(n); for(auto edge:edges) unions(edge.first,edge.second); for(int i=0;i<n;i++) if(id[i]==i) cnt++; return cnt; }
Graph Valid Tree
考察一:无环图考察二:树的边的个数edges=vertices-1
bool ValidTree(int n, vector<pair<int, int>>& edges){ if(edges.empty() || edges.size()!=n-1) return false; UF(n); for(auto edge:edges){ int x=find(edge.first); int y=find(edge.second); if(x==y) return false; id[x]=y; } return true; }
相关文章推荐
- 我为何放弃Gulp与Grunt,转投npm scripts(下)
- 架构设计要考虑的几个方面
- JFinal开发web项目出现故障小记
- 录音
- S - stl 的mapⅠ
- linker command failed with exit code 1 (use -v to see invocation)
- Android日常开发60条经验
- 瑞芯微RK3188如何配置USB摄像头支持
- 瑞芯微RK3188如何配置USB摄像头支持
- C++2远征之离港篇
- java设计模式之策略模式
- 瑞芯微RK3188如何配置USB摄像头支持
- JDK5并发(2) Locks-ReentrantLock
- MySQL索引
- jQuery--基础知识速查表
- localhost与127.0.0.1的区别
- kidd风IOS开发日志之Git的常用终端指令
- 对于恶意诈骗短信中包含的链接的一次研究
- yii phpexcel自己主动生成文件保存到server上
- 百度金矿 百度矿机内测 迅雷赚钱宝 Pro QQ群 289013426