สมมุติว่าเรามีต้นไม้ที่ยังไม่ได้ทำการรูทต้นเดียว นี่เป็นกราฟแบบไม่มีทิศทางเดียวที่ไม่มีวัฏจักร อินพุตที่กำหนดคือกราฟที่เริ่มต้นเป็นต้นไม้ที่มีโหนด N (ค่าของโหนดเป็นค่าที่แตกต่างกันตั้งแต่ 1 ถึง N) โดยมีการเพิ่มขอบเพิ่มเติมหนึ่งรายการ ขอบที่เพิ่มเข้ามามีจุดยอดที่แตกต่างกันสองจุดที่เลือกจาก 1 ถึง N และไม่ใช่ขอบที่มีอยู่แล้ว
กราฟสุดท้ายจะได้รับเป็นอาร์เรย์ 2 มิติของขอบ องค์ประกอบของขอบแต่ละอันเป็นคู่ [u, v] โดยที่ u
เราต้องหาขอบที่สามารถลบออกได้เพื่อให้กราฟที่ได้เป็นทรีของโหนด N อาจมีหลายคำตอบ เราต้องหาคำตอบสุดท้ายใน 2Darray ที่ให้มา ขอบคำตอบ [u, v] ควรอยู่ในรูปแบบเดียวกันกับ u
ดังนั้น หากอินพุตเป็นแบบ [[1,2], [2,3], [3,4], [1,4], [1,5]],
แล้วผลลัพธ์จะเป็น [1,4]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
ไม่มี :=1,000
กำหนดขนาดพาเรนต์ของอาร์เรย์:N+5
กำหนดลำดับขนาดอาร์เรย์:N+5
กำหนดฟังก์ชัน getParent() ซึ่งจะใช้เวลา n
ถ้า parent[n] เหมือนกับ -1 แล้ว −
กลับ n
ส่งคืนพาเรนต์[n] =getParent(พาเรนต์[n])
กำหนดฟังก์ชัน unionn() ซึ่งจะใช้ a, b,
pa :=getParent(a), pb :=getParent(b)
ถ้า pa เหมือนกับ pb แล้ว −
คืนค่าเท็จ
ถ้า rank[pa]> rank[pb] แล้ว −
อันดับ[pa] :=อันดับ[pa] + อันดับ[pb]
ผู้ปกครอง[pb] :=pa
มิฉะนั้น
อันดับ[pb] :=อันดับ[pb] + อันดับ[pa]
ผู้ปกครอง[pa] :=pb
คืนความจริง
จากวิธีหลัก ให้ทำดังนี้ −
n :=ขนาดของรายการขอบ
สำหรับการเริ่มต้น i :=0 เมื่อ i
parent[edges[i, 0]] :=-1, parent[edges[i, 1]] :=- 1
อันดับ[ขอบ[i, 0]] :=-1 อันดับ[ขอบ[i, 1]] :=1
กำหนดอาร์เรย์และ
สำหรับการเริ่มต้น i :=0 เมื่อ i
u :=edge[i, 0]
v :=ขอบ[i, 1]
ถ้า unionn(u, v) เป็นศูนย์ ดังนั้น −
ตอบ :=ขอบ[i]
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
const int N = 1000;
class Solution {
public:
int parent[N + 5];
int rank[N + 5];
int getParent(int n){
if (parent[n] == -1)
return n;
return parent[n] = getParent(parent[n]);
}
bool unionn(int a, int b){
int pa = getParent(a);
int pb = getParent(b);
if (pa == pb)
return false;
if (rank[pa] > rank[pb]) {
rank[pa] += rank[pb];
parent[pb] = pa;
}
else {
rank[pb] += rank[pa];
parent[pa] = pb;
}
return true;
}
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int n = edges.size();
for (int i = 0; i < n; i++) {
parent[edges[i][0]] = parent[edges[i][1]] = -1;
rank[edges[i][0]] = rank[edges[i][1]] = 1;
}
vector<int> ans;
for (int i = 0; i < n; i++) {
int u = edges[i][0];
int v = edges[i][1];
if (!unionn(u, v)) {
ans = edges[i];
}
}
return ans;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{1,2}, {2,3}, {3,4}, {1,4}, {1,5}};
print_vector(ob.findRedundantConnection(v));
}
อินพุต
{{1,2}, {2,3}, {3,4}, {1,4}, {1,5}}
ผลลัพธ์
[1, 4, ]