并:Union:合并:合并两个不同的集合;
查:Find:查找:判断两个集合是否在一个集合;
集:Set:集合;
- /**
- 并:Union:合并:合并两个不同的集合;
- 查:Find:查找:判断两个集合是否在一个集合;
- 集:Set:集合;
- */
-
- /**
- #include
-
- using namespace std;
-
- #define MAXN 1000
- typedef int ElementType;
- typedef int SetName;
- typedef ElementType SetType[MAXN];
-
- SetName FindFather(SetType S,ElementType x); //查找x所属元素的集合;
- void Union(SetType S,SetName root1,SetName root2); //合并两个不同的集合
-
- int main()
- {
- int n;
- cin >> n;
-
- return 0;
- }
-
- SetName FindFather(SetType S,ElementType x); //查找x所属元素的集合;
- {
- while(S[x]>=0)
- x=S[x];
- return x;
- }
-
- void Union(SetType S,SetName root1,SetName root2); //合并两个不同的集合
- {
- root1=FindFather(S,root1);
- root2=FindFather(S,root2);
- if(root1!=root2)
- S[root1]=root2;
- }
- */
2)按秩合并集合,对Union进行优化;
- /**
- 2)按秩合并集合,对Union进行优化;
- */
-
- /**
- 并:Union:合并:合并两个不同的集合;
- 查:Find:查找:判断两个集合是否在一个集合;
- 集:Set:集合;
- */
-
- /**
- #include
-
- using namespace std;
-
- #define MAXN 1000
- typedef int ElementType;
- typedef int SetName;
- typedef ElementType SetType[MAXN];
-
- SetName FindFather(SetType S,ElementType x); //查找x所属元素的集合;
- void Union(SetType S,SetName root1,SetName root2); //合并两个不同的集合
-
- int main()
- {
- int n;
- cin >> n;
-
- return 0;
- }
-
- SetName FindFather(SetType S,ElementType x) //查找x所属元素的集合;
- {
- while(S[x]>=0)
- x=S[x];
- return x;
- }
-
- void Union(SetType S,SetName root1,SetName root2) //合并两个不同的集合
- {
- root1=FindFather(S,root1);
- root2=FindFather(S,root2);
- if(root1!=root2)
- {
- if(S[root1]
- {
- S[root1]+=S[root2];
- S[root2]=root1; //将root2(矮树)挂在root1(高树)上;
- }
- else if(S[root2]
- {
- S[root2]+=S[root1];
- S[root1]=root2;
- }
- }
- }
- */
3)路径压缩:将集合的每个子孩子的父亲节点都设置为根节点;
以便为后面的Find函数减低查找时间;对Find进行优化;
-
- /**
- 3)路径压缩:将集合的每个子孩子的父亲节点都设置为根节点;
- 以便为后面的Find函数减低查找时间;对Find进行优化;
- */
-
- /**
- 并:Union:合并:合并两个不同的集合;
- 查:Find:查找:判断两个集合是否在一个集合;
- 集:Set:集合;
- */
-
-
- #include
-
- using namespace std;
-
- #define MAXN 1000
- typedef int ElementType;
- typedef int SetName;
- typedef ElementType SetType[MAXN];
-
- SetName FindFather(SetType S,ElementType x); //查找x所属元素的集合;
- void Union(SetType S,SetName root1,SetName root2); //合并两个不同的集合
-
- int main()
- {
- int n;
- cin >> n;
-
- return 0;
- }
-
- SetName FindFather(SetType S,ElementType x) //查找x所属元素的集合;
- {
- if(S[x]<0)
- return x;
- else
- return S[x]=Find(S,S[x]);
- }
-
- void Union(SetType S,SetName root1,SetName root2) //合并两个不同的集合
- {
- root1=FindFather(S,root1);
- root2=FindFather(S,root2);
- if(root1!=root2)
- {
- if(S[root1]
//如果集合root1的元素要多一点 - {
- S[root1]+=S[root2];
- S[root2]=root1; //将root2(矮树)挂在root1(高树)上;
- }
- else if(S[root2]
- {
- S[root2]+=S[root1];
- S[root1]=root2;
- }
- }
- }
-
相关阅读:
Spark SQL 每年的1月1日算当年的第一个自然周, 给出日期,计算是本年的第几周
《算法通关村第二关——终于学会链表反转了》
Lucene数据写入流程
LVGL自定义组件__页面指示器
k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?
风控知多点|模型是哪些内容出现了变动才需要重新迭代调整?
遗传算法GA求解非连续函数问题
HTTP状态码206报错
C语言之文件操作
Spring Boot到底是如何进行自动配置的?
-
原文地址:https://blog.csdn.net/qq_51825761/article/details/126206159