2026/4/18 1:56:59
网站建设
项目流程
网站建设正文字体多大合适,吕梁市建设局网站,公众号怎么推广快又有效,福田营销型网站建站推广外包题目传送门
1.并查集是什么#xff1f;
本质是一种树形结构#xff08;拥有相同根节点的多叉树#xff09;#xff0c;可以很方便的判断集合元素之间的从属关系。
2.如何维护好一个并查集#xff1f;
并查集的本质在于相同的根节点#xff0c;那么只需要通过某种方式…题目传送门1.并查集是什么本质是一种树形结构拥有相同根节点的多叉树可以很方便的判断集合元素之间的从属关系。2.如何维护好一个并查集并查集的本质在于相同的根节点那么只需要通过某种方式记录好组内每一个元素的根节点比较两个元素根节点是否相同就可以判断是否在同一个集合内。3.如何判断根节点我们可以定义根节点的上一个节点为自己这样子我们便有一个判断的条件了。开始写代码吧。头部分#includeiostream using namespace std; int fa[5010]; int main{ int a,b,c; cinabc; int m,n; }首先我们要初始化所有数的根为自身for(int i1;ia;i){ fa[i]i;//fa是father数组记录其上一个节点信息 }其次就是处理输入信息我们要先读取两个整数这两个整数是在同一个集合内的。然后我们就要找他的根。int find(int x){ while(x!fa[x]){//循环找根节点由根节点的定义 xfa[x]; } return x;//返回找到的根节点 }然后我们要统一两个数的根这里我们可以想象一个图a db b b e e e e e e e e e e e ec c c c c c.虽然有点丑但是应该能看到这是一个三层和两层的树我们要做的实际上是把他的根节点统一即下图如果这么丑也能算图的话ab b b dc c c c c c. e e e e e e e e e e e e其实就是把一棵树全部注意是全部嫁接到另一棵树上。for(int i0;ib;i){ cinmn; if(find(m)!find(n)) fa[find(m)]find(n);//将一棵树的根节点插入到另一棵树上 }然后就是判断是否相同了很简单直接贴完整代码了#includeiostream using namespace std; int fa[5010]; int find(int x){ while(x!fa[x]){ xfa[x]; } return x; } int main(){ int a,b,c; cinabc; int m,n; for(int i1;ia;i){ fa[i]i; } for(int i0;ib;i){ cinmn; if(find(m)!find(n)) fa[find(m)]find(n); } for(int i0;ic;i){ cinmn; if(find(m)find(n)) printf(Yes\n); else printf(No\n); } return 0; }