알고리즘 분석 및 설계 분리 된 세트

연결되지 않은 설정 한 연구 노트

연결되지 않은-설정은 (설정 조합 찾기) 추상 데이터 유형입니다. 그것은, 즉 동적 유지 요소 세트 간의 복잡한 관계를 처리하는 「설정」의 관계를 다루는
특정 장애의 두 요소는 (a, b), 고속 요구 "병합" 각각 A 및 B를 반복 할 필요 동안에 "발견"요소의 집합이 위치 컬렉션. "그리고", "확인"이에서 단어를 "설정".

통합 된 요소의 컬렉션은, 요소를 찾을 곳 컬렉션

배열 달성

연결되지 않은-설정 작업 지원

(X) MAKE : 새 컬렉션을 만들려면 그 구성원 만 (동시에 대표하는 것입니다) ×입니다. 각 집합이 분리되기 때문에, 다른 세트의 X 요구가 있었다.
UNIONN (X, Y) : X와 Y (예컨대 내지 Sx 및 싸이)와 동적 세트는 새로운 세트로 병합,이 동작하기 전에 두 세트가 분리되어있는 것으로한다. 결과 세트 Sx∪Sy의 회원의 대표입니다. 일반적으로, 다양한 실시 예에서, 일반적으로 새로운 집합의 대표 내지 Sx 또는 싸이를 표현한다. 그 후, 새로운 세트 대신 일본어 내지 Sx 및 S의 싸이.
(X) 찾기 : X를 포함하는 대표 세트에 대한 포인터를 돌려줍니다.

탐색

int find(int x) {  //用非递归的实现  
  while (father[x] != x) x = father[x];  
  return x;
  
}
int find(int x){//用递归的实现  
    if (father[x] != x){  
        return find(father[x]);  
    } else{  
        return x;  
    }   
}

합병

void unionn(int r1,int r2){
      father[r2] = r1;
  }
    int main(){
      cin >> n >> m;
      for (i = 1; i <= n; i++)
          father[i] = i;           //建立新的集合,其仅有的成员是i
      for (i = 1; i <= m; i++) {
          scanf("%d%d",&x,&y);
          int r1 = find(x);
          int r2 = find(y);
          if (r1 != r2){
                unionn(r1,r2);
            }   
      }    
      cin >> q;
      for (i = 1; i <= q; i++)  {
          scanf("%d%d",&x,&y);
          if (find(x) == find(y)){
                printf("Yes\n");
            } else {
                printf("No\n");
            }
      }
      return 0;
  }

블로그 기사 여러 플랫폼에서이 문서 OpenWrite의 출시!

추천

출처www.cnblogs.com/ZCWang/p/11656660.html