种类并查集

扩展域并查集,可以维护两种及以上的关系

假想敌:假设i的敌人是i+n,范围多了一倍

  • 三种关系:友好关系,敌对关系,暂时无关系
  • 三种操作:
    • 确认友好关系(合并)
    • 确认敌对关系:x和y是敌人,即x和y的敌人合并,y和x的敌人合并
    • 查询:
        void search(int a,int b){
      	  int root1=findRoot(a);
      	  int root2=findRoot(b);
      	  if(root1==root2){
      		  cout<<"朋友关系"<<endl;
      		  return;
      	  }
      	  int root3=findRoot(a+n);    //a的敌人
      	  int root4=findRoot(b+n);    //b的敌人
      	  if(root1==root4&&root2==root2){
      		  cout<<"敌人关系"<<endl;
      		  return;
      	  }
      	  cout<<"暂无关系"<<endl;
        }
      

若有更多的关系,范围可以再扩大,比如假设i的天敌是i+n,假设i的猎物是i+2n,假设i的同类是i+3n,范围扩大了3倍

posted @ 2026-04-04 09:35  mofei1116  阅读(9)  评论(0)    收藏  举报