算法导论 并查集

来源:互联网 发布:品牌管理课程 知乎 编辑:程序博客网 时间:2024/05/21 15:03
并查集#include<iostream>using namespace std;typedef char NodeItemType;typedef struct Node{Node* p;NodeItemType key;int rank;}TreeNode,*pTreeNode;void MAKE_SET(pTreeNode x){x->p=x;x->rank=0;}void LINK(pTreeNode x,pTreeNode y){if(x->rank>y->rank)y->p=x;elsex->p=y;if(x->rank==y->rank)y->rank=y->rank+1;}pTreeNode FIND_SET(pTreeNode x){if(x!=x->p)x->p=FIND_SET(x->p);return x->p;}void UNION(pTreeNode x,pTreeNode y){LINK(FIND_SET(x),FIND_SET(y));}int main(){TreeNode node[10]={{NULL,'a',0},{NULL,'b',0},{NULL,'c',0},{NULL,'d',0},{NULL,'e',0},{NULL,'f',0},{NULL,'g',0},{NULL,'h',0},{NULL,'i',0},{NULL,'j',0}};for(int i=0;i<10;i++)MAKE_SET(&node[i]);UNION(&node[1],&node[3]);UNION(&node[4],&node[6]);UNION(&node[0],&node[2]);UNION(&node[7],&node[8]);UNION(&node[0],&node[1]);UNION(&node[4],&node[5]);UNION(&node[1],&node[2]);pTreeNode p1,p2;p1=FIND_SET(&node[0]);p2=FIND_SET(&node[3]);if(p1==p2)cout<<"OK!"<<endl;elsecout<<"Not in a array!"<<endl;return 0;}