双亲树-等价类
来源:互联网 发布:软件编写目的 编辑:程序博客网 时间:2024/05/01 00:38
用双亲树的思想实现了一个等价类。完成了路径压缩。算法仍然采用严蔚敏的教材中等价类章节中的算法。
/* Author : Moyiii * Mail: lc09@vip.qq.com * 树的双亲表示法&等价类实现 * 仅作学习之用,当然如果 * 你想拿去用,随你好啦。*/#include<iostream>using namespace std;#define MAX_NODES 100class PTree{public: PTree(); void print(); void input(); int findClass(int a);private: void mergeNodes(int a,int b); void fixNode(int a); int nodes[MAX_NODES]; int nodeNum;};PTree :: PTree(){ nodeNum = 0;}//输入两个数字,然后将这两个数字所在的集合合并成一个集合void PTree :: input(){ cout << "Please enter the amount of the nodes:"; cin >> nodeNum; for(int i = 0; i < nodeNum; ++i) { nodes[i] = -1; } cout << "Please enter two numbers that belong to the same class" << endl; cout << "End with -1 -1" << endl; int m,n; while(cin >> m >> n && m != -1 && n != -1) { if(m > nodeNum || n > nodeNum) { cout << "Error data!" << endl; continue; } //从根合并 int i = findClass(m); int j = findClass(n); mergeNodes(i,j); }}//找到根int PTree :: findClass(int a){ fixNode(a); while(nodes[a-1] > 0) { a = nodes[a - 1]; } return a;}//将从a到a的根部之间的节点都直接指向a的根用来压缩路径void PTree :: fixNode(int a){ //找到a的根节点 int paren = a; while(nodes[paren - 1] > 0) { paren = nodes[paren - 1]; } int temp = a; //将a到根之间的节点都指向paren while(nodes[temp - 1] > 0) { int x = nodes[temp - 1]; nodes[temp - 1] = paren; temp = x; } return;}//合并两个等价类的根部,把节点少的合并到节点多的地方void PTree :: mergeNodes(int a, int b){ //根节点的数据是负数,其绝对值代表这个等价类中有多少个数据 if(a == b) { return; } if(nodes[a - 1] < nodes[b - 1]) { nodes[a - 1] += nodes[b - 1]; nodes[b - 1] = a; fixNode(a); } else { nodes[b - 1] += nodes[a - 1]; nodes[a - 1] = b; fixNode(b); }}//打印函数void PTree :: print(){ cout << "----------Datas-----------" << endl; for(int i = 0; i < nodeNum; ++i) { cout << i+1 << " " << nodes[i] << endl; } return;}/*测试数据83 56 73 7-1 -1*/int main(){ PTree eq; eq.input(); cout << eq.findClass(3) << endl; eq.print(); return 0;}
0 0
- 双亲树-等价类
- 树与等价类
- 等价类
- 等价类
- 等价类
- 等价类
- 树的双亲存储
- 树 的 双亲表示法 及 双亲孩子表示法
- 类加载器的双亲委派及打破双亲委派
- 树的双亲表示法
- 树的双亲表示法
- 树的双亲表示法
- 树的双亲表示法
- 类加载双亲委派模型
- 离散数学 等价类 等价关系 划分
- 树与等价问题
- LintCode_469_等价二叉树
- LintCode:等价二叉树
- 看书《DIV+CSS商业案例与网页布局开发精讲》_盒子模型、制作logo和banner_随手笔记
- 怎么查看端口号所对应的应用程序(Windows)
- itext 图片问题
- 上传图片之上传前判断文件格式与大小
- HDU -- 1203 I NEED A OFFER!
- 双亲树-等价类
- Android开发之onSaveInstanceState和onRestoreInstanceState
- 表单提交Jquery
- unity学习笔记【点击地面人物走动】
- simple CPS transforme(language : Scheme,author : Wang Ying
- 现阶段对boost::asio的理解
- cxf调用webservice方式,网上所得
- YII2.0 Activeform
- 关于一篇MSDN(January2006)上的一个XML操作--复制结点