สมมติว่าเรามีอาร์เรย์ A ของจำนวนเต็มบวกเฉพาะ พิจารณากราฟต่อไปนี้ −
มีจำนวนโหนดที่มีความยาว A[0] ถึง A[ขนาด A - 1] มีขอบระหว่าง A[i] และ A[j] เมื่อ A[i] และ A[j] มีปัจจัยร่วมมากกว่า 1 เราต้องหาขนาดขององค์ประกอบที่เชื่อมต่อที่ใหญ่ที่สุดในกราฟ
ดังนั้นหากอินพุตเป็น [4,6,15,35] ผลลัพธ์จะเป็น 4
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดพาเรนต์อาร์เรย์
-
กำหนดอันดับอาร์เรย์
-
กำหนดอันดับอาร์เรย์
-
ถ้า parent[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]
-
parent[parX] :=parY
-
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
ret :=0, n :=ขนาดของ A
-
parent :=กำหนดขนาดอาร์เรย์ n เติมด้วย -1
-
rank :=กำหนดอาร์เรย์ขนาด n เติมด้วย 1
-
กำหนดหนึ่งแผนที่ m
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
x :=A[i]
-
สำหรับการเริ่มต้น j :=2 เมื่อ j * j <=x อัปเดต (เพิ่ม j ขึ้น 1) ให้ทำ -
-
ถ้า x mod j เท่ากับ 0 แล้ว &minsu;
-
ถ้า j อยู่ใน m แล้ว −
-
ยูเนียน(m[j], ผม)
-
-
มิฉะนั้น
-
m[j] :=ผม
-
-
ถ้า (x / j) อยู่ในหน่วย m แล้ว −
-
ยูเนียน(m[x / j], ผม)
-
-
มิฉะนั้น
-
ม[x / j] =ผม
-
-
-
-
ถ้า x เป็น m แล้ว −
-
ยูเนียน(m[x], ผม)
-
-
มิฉะนั้น
-
ม[x] :=ผม
-
-
ret :=สูงสุดของ ret และอันดับ[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