并查集 比眉伴天荒 2021-06-22 15:37 537阅读 0赞 并查集的作用就是快速判断两个元素是否在同一个集合中,快速将两个集合合并 基本模板 #include <iostream> #include <algorithm> using namespace std; const int maxn=1e5+10; int n,m; int f[maxn];// 当前节点的父节点 int find(int x){ //路径压缩的写法 ,返回的该节点的祖宗节点 if(x!=f[x]){ //如果一个点的父亲节点是本身就说明 f[x]=find(f[x]); } //查找x所在集合的祖先节点下标,将x的父亲节点指向祖先节点 return f[x]; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ f[i]=i;//首先将每个节点的父亲初始化为自己本身,自己是一个集合 } char c; while(m--){ cin>>c; int a,b; if(c=='M'){ cin>>a>>b; int fa=find(a); int fb=find(b); if(fa!=fb){ //如果a和b不是同一个集合 f[fa]=fb;//将a的祖先节点的父亲指向b的祖先节点 } } else if(c=='Q'){ cin>>a>>b; int fa=find(a); int fb=find(b); if(fa==fb){ //如果祖先节点相同说明在一个集合中 cout<<"Yes"<<endl; } else{ cout<<"No"<<endl; } } } return 0; } 应用求每个集合的数量,只需要维护的是祖先节点的数量代表整个集合的数量即可 给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。 现在要进行m个操作,操作共有三种: “C a b”,在点a和点b之间连一条边,a和b可能相等; “Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等; “Q2 a”,询问点a所在连通块中点的数量; 输入格式 第一行输入整数n和m。 接下来m行,每行包含一个操作指令,指令为“C a b”,“Q1 a b”或“Q2 a”中的一种。 输出格式 对于每个询问指令”Q1 a b”,如果a和b在同一个连通块中,则输出“Yes”,否则输出“No”。 对于每个询问指令“Q2 a”,输出一个整数表示点a所在连通块中点的数量 每个结果占一行。 数据范围 1≤n,m≤105 输入样例: 5 5 C 1 2 Q1 1 2 Q2 1 C 2 5 Q2 5 输出样例: Yes 2 3 #include <iostream> #include <algorithm> #include <string> using namespace std; const int maxn=1e5+10; int n,m; int f[maxn];// 当前节点的父节点 int cnt[maxn];//统计集合内元素的数量 int find(int x){ //路径压缩的写法 if(x!=f[x]){ //如果一个点的父亲节点是本身就说明 f[x]=find(f[x]); } //查找x所在集合的祖先节点下标,将x的父亲节点指向祖先节点 return f[x]; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ f[i]=i; cnt[i]=1;//首先将每个节点的父亲初始化为自己本身,自己是一个集合 } string op; while(m--){ cin>>op; int a,b; if(op=="C"){ cin>>a>>b; int fa=find(a); int fb=find(b); if(fa!=fb){ //如果a和b不是同一个集合 cnt[fb]+=cnt[fa]; f[fa]=fb;//将a的祖先节点的父亲指向b的祖先节点 } } else if(op=="Q1"){ cin>>a>>b; int fa=find(a); int fb=find(b); if(fa==fb){ //如果祖先节点相同说明在一个集合中 cout<<"Yes"<<endl; } else{ cout<<"No"<<endl; } } else if(op=="Q2"){ int a; cin>>a; cout<<cnt[find(a)]<<endl; } } return 0; }
相关 并查集 Ⅱ \[poj 1611\] ([http://poj.org/problem?id=1611][http_poj.org_problem_id_1611]) 题目描述: T 古城微笑少年丶/ 2022年08月03日 14:35/ 0 赞/ 252 阅读
相关 并查集 并查集JAVA版框架 并查集是一种用来管理元素分组情况的数据结构。 并查集可以高效地进行如下操作: \--查询元素a和元素b是否属于同一组 落日映苍穹つ/ 2022年06月16日 12:44/ 0 赞/ 287 阅读
相关 并查集 这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的 港控/mmm°/ 2022年06月13日 14:13/ 0 赞/ 276 阅读
相关 并查集 > 题目 > 某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签 Myth丶恋晨/ 2022年06月08日 09:24/ 0 赞/ 285 阅读
相关 并查集 森林: 森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集 ![20181112082744488.png][] 并查集: 并查集的结构和森林十分相似,是 Love The Way You Lie/ 2022年04月17日 02:27/ 0 赞/ 344 阅读
相关 并查集 来看一个实例,[杭电1232畅通工程][1232] 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性 我就是我/ 2022年03月29日 10:58/ 0 赞/ 338 阅读
相关 并查集 > 并查集是一种树形的数据结构,用于集合的合并。 与C++STL相比的优势: 1. 可以同时维护多个集合 2. 快速的合并两个集合 \\现实: 用数组实现。fat 左手的ㄟ右手/ 2022年02月05日 00:23/ 0 赞/ 239 阅读
相关 并查集 并查集 并查集是对树的一种操作,旨在找到某个节点的公共祖先(最老公共祖先)。我们先讲一下并。 并 并就是讲两个节点合并到一个集合里面(这个集合必须是树),每个节点 谁践踏了优雅/ 2021年12月15日 11:33/ 0 赞/ 371 阅读
相关 并查集 一、算法解释 用于解决一些有N个元素的集合应用问题。 1、将每个元素初始化为自身单独成为一个集合。用p\[i\]的值表示该元素所在集合。 ![这里写图片描述][S 桃扇骨/ 2021年09月14日 02:56/ 0 赞/ 446 阅读
相关 并查集 并查集的作用就是快速判断两个元素是否在同一个集合中,快速将两个集合合并 基本模板 include <iostream> include <a 比眉伴天荒/ 2021年06月22日 15:37/ 0 赞/ 538 阅读
还没有评论,来说两句吧...