고유한 양의 정수로 구성된 배열 A가 있다고 가정하고 이제 다음 그래프를 고려하십시오. -
A 길이의 노드가 여러 개 있으며 A[0]에서 A[A - 1의 크기]까지 레이블이 지정됩니다. A[i]와 A[j]가 1보다 큰 공약수를 공유할 때 A[i]와 A[j] 사이에 간선이 있습니다. 그래프에서 가장 큰 연결 성분의 크기를 찾아야 합니다.
따라서 입력이 [4,6,15,35]와 같으면 출력은 4
가 됩니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
배열 부모 정의
-
배열 순위 정의
-
배열 순위 정의
-
부모[x]가 -1과 같으면 -
-
x를 반환
-
-
부모[x] 반환 =getParent(부모[x])
-
함수 unionn()을 정의하면 x, y,
가 필요합니다. -
parX :=getParent(x)
-
parY :=getParent(y)
-
parX가 parY와 같으면 -
-
반환
-
-
rank[parX]>=rank[parY]이면 -
-
순위[parX] :=순위[parX] + 순위[parY]
-
부모[parY] :=parX
-
-
그렇지 않으면
-
순위[parY] :=순위[parY] + 순위[parX]
-
부모[parX] :=parY
-
-
주요 방법에서 다음을 수행하십시오 -
-
ret :=0, n :=A의 크기
-
parent :=크기가 n인 배열을 -1로 채우십시오.
-
rank :=n 크기의 배열을 정의하고 1로 채웁니다.
-
하나의 맵 정의
-
initialize i :=0의 경우, i
-
x :=A[i]
-
j를 초기화하기 위해 :=2, j * j <=x일 때 업데이트(j를 1만큼 증가), −
-
x mod j가 0과 같으면 &minsu;
-
j가 m에 있으면 -
-
결합(m[j], i)
-
-
그렇지 않으면
-
m[j] :=나는
-
-
(x / j)가 m인 경우 -
-
유니온(m[x / j], i)
-
-
그렇지 않으면
-
m[x/j] =i
-
-
-
-
x가 m이면 -
-
결합(m[x], i)
-
-
그렇지 않으면
-
m[x] :=나는
-
-
ret :=ret 및 rank의 최대값[getParent(i)]
-
-
리턴 렛
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> parent;
vector<int> rank;
int getParent(int x){
if (parent[x] == -1)
return x;
return parent[x] = getParent(parent[x]);
}
void unionn(int x, int y){
int parX = getParent(x);
int parY = getParent(y);
if (parX == parY)
return;
if (rank[parX] >= rank[parY]) {
rank[parX] += rank[parY];
parent[parY] = parX;
} else {
rank[parY] += rank[parX];
parent[parX] = parY;
}
}
int largestComponentSize(vector<int>& A) {
int ret = 0;
int n = A.size();
parent = vector<int>(n, -1);
rank = vector<int>(n, 1);
unordered_map<int, int> m;
for (int i = 0; i < n; i++) {
int x = A[i];
for (int j = 2; j * j <= x; j++) {
if (x % j == 0) {
if (m.count(j)) {
unionn(m[j], i);
} else {
m[j] = i;
}
if (m.count(x / j)) {
unionn(m[x / j], i);
} else {
m[x / j] = i;
}
}
}
if (m.count(x)) {
unionn(m[x], i);
} else {
m[x] = i;
}
ret = max(ret, rank[getParent(i)]);
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {4,6,15,35};
cout << (ob.largestComponentSize(v));
} 입력
{4,6,15,35} 출력
4