연결되지 않은 설정 한 연구 노트
연결되지 않은-설정은 (설정 조합 찾기) 추상 데이터 유형입니다. 그것은, 즉 동적 유지 요소 세트 간의 복잡한 관계를 처리하는 「설정」의 관계를 다루는
특정 장애의 두 요소는 (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의 출시!