สมมติว่าเรามีรายชื่อภูมิภาคบางรายการซึ่งภูมิภาคแรกของแต่ละรายการรวมภูมิภาคอื่นๆ ทั้งหมดไว้ในรายการนั้น โดยพื้นฐานแล้วหากภูมิภาค X มีขอบเขต Y อื่น X จะมากกว่า Y และตามคำจำกัดความภูมิภาค X จะมีตัวมันเอง ถ้าเรามีสองภาค r1 และ r2, เราต้องหาพื้นที่ที่เล็กที่สุดที่มีทั้งคู่ ดังนั้นถ้าเรามี r1, r2 และ r3 ที่ r1 รวม r3 ก็รับประกันได้ว่าไม่มี r2 ที่ r2 รวม r3 ดังนั้น ถ้าอินพุตเป็นเหมือน [["Earth","อเมริกาเหนือ","South America"], ["North America","United States","Canada"], ["United States","New York", "บอสตัน"],["แคนาดา","ออนแทรีโอ","ควิเบก"],["อเมริกาใต้","บราซิล"]] และ r1 ='ควิเบก' และ r2 ='นิวยอร์ก' จากนั้นผลลัพธ์จะเป็น 'อเมริกาเหนือ'
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างแผนที่ชื่อพาเรนต์
- สำหรับ i ในช่วง 0 ถึงขนาด r
- สำหรับ j ในช่วง 1 ถึงขนาดของ r[i]
- พาเรนต์[r[i, j]] :=r[i, 0]
- สำหรับ j ในช่วง 1 ถึงขนาดของ r[i]
- สร้างชุดที่เรียกว่า chain และใส่ x ลงใน chain
- ในขณะที่ x อยู่ในพาเรนต์
- x :=parent[x]
- ใส่ x เข้าโซ่
- ในขณะที่มี y อยู่ในสายโซ่
- y :=parent[y]
- คืน y
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string findSmallestRegion(vector<vector<string>>& r, string x, string y) {
map < string, string> parent;
for(int i = 0; i < r.size(); i++){
for(int j = 1; j < r[i].size(); j++){
parent[r[i][j]] = r[i][0];
}
}
set <string> chain;
chain.insert(x);
while(parent.find(x)!=parent.end()){
x = parent[x];
chain.insert(x);
}
while(chain.find(y)==chain.end()){
y = parent[y];
}
return y;
}
};
main(){
vector<vector<string>> v = {
{"Earth","North America","South America"},
{"North America","United States","Canada"},
{"United States","New York","Boston"},
{"Canada","Ontario","Quebec"},{"South America","Brazil"}
};
Solution ob;
cout << (ob.findSmallestRegion(v, "Quebec", "New York"));
} อินพุต
[["Earth","North America","South America"],["North America","United States","Canada"], ["United States","New York","Boston"],["Canada","Ontario","Quebec"],["South America","Brazil"]] "Quebec" "New York"
ผลลัพธ์
North America