C++맵 을 이용 하여 집합 을 실현 하고 찾 습 니 다.

2219 단어 C++map병 찰 집
그리고 집합(Union-Find)은 트 리 형 데이터 구조 로 교차 하지 않 는 집합(Disjoint Sets)의 합병 과 조회 문 제 를 처리 하 는 데 사용 된다.그리고 집합 에 두 가지 조작(1.Union 연합 2.finddeputy 가 대표 노드 를 찾 습 니 다)과 풀 어야 할 문제(issameset 가 한 집합 에 있 는 지,또는 같은 대표 노드 가 있 는 지)가 있 는 지 확인 합 니 다.
맵 을 이용 하여 주로 두 맵 의 대상,하나의 맵형식의 fathermap 를 실현 합 니 다.키 워드 는 하위 노드 이 고 값 은 부모 노드(부모 노드 가 반드시 결점 을 대표 하 는 것 은 아 닙 니 다)입 니 다.두 개의 요소 가 한 집합 에 있 는 지 찾 아야 할 때 계속 위로 찾 아야 합 니 다(함수 finddupty).찾 는 과정 에서 경 로 를 압축 합 니 다.길 을 따라 지나 가 는 결점 을 대표 결점 에 직접 걸 어 공 통 된 대표 결점 이 있 는 지 확인한다.
형식의 sizemap,key 는 결점 이 고 value 는 하위 결점 의 개수(이 개 수 는 결점 만 대표 하고 하위 결점 은 무효)입 니 다.주요 용 도 는 합병(union)할 때 하위 결점 이 비교적 적은 대표 결점 을 하위 결점 대표 가 비교적 많은 대표 결점 에 걸 어 두 는 것 입 니 다.또한 sizemap 에서 부모 노드 에 대응 하 는 value 는 하위 노드 가 비교적 적은 대표 적 인 노드 개 수 를 더 해 야 합 니 다.
코드 는 다음 과 같 습 니 다:

#include<map>
#include<list>
#include<iostream>
using namespace std;
 
template<typename data>
class Unionfindset{
public:
 void makesets(list<data> nodes)
 {
  fathermap.clear();
  sizemap.clear();
  for(auto node:nodes)
  {
   fathermap[node]=node;
   sizemap[node]=1;   
  }
 }
 
//      ,     
 data findduputy(data node)
 {
  data father=fathermap[node];
  if(father!=node)
  {
   return findduputy(father);
  }
  fathermap[node]=father;
  return father;
 } 
 
 void Union(data a ,data b)
 {
  data ahead=findduputy(a);
  data bhead=findduputy(b);
  if(ahead!=bhead)
  {
   data asize=sizemap[a];
   data bsize=sizemap[b];
   if(asize<bsize)
   {
    fathermap[a]=b;
    sizemap[b]=bsize+asize;
   }
   else 
   {
    fathermap[b]=a;
    sizemap[a]=bsize+asize;
   }  
  }  
 } 
 
 bool issameset(data a,data b)
 {
  return findduputy(a)==findduputy(b);
 }
 
private:
 map<data,data> fathermap;
 map<data,data> sizemap;
};
읽 어 주 셔 서 감사합니다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기