ตามความเป็นจริงแล้ว ฟังก์ชันนี้ไม่ได้คำนวณเส้นผ่านศูนย์กลาง มันคำนวณจุดยอดที่ไกลที่สุดจากจุดยอดที่กำหนด v
ในการคำนวณเส้นผ่านศูนย์กลางของต้นไม้ คุณต้องเลือกจุดยอดที่ต้องการก่อน (เช่น v
) จากนั้นหาจุดยอดที่อยู่ห่างจาก v
มากที่สุด (เช่น w
) จากนั้นหาจุดยอดที่อยู่ห่างจาก w
มากที่สุด มานั่งกันเถอะ u
ระยะห่างระหว่าง w
ถึง u
คือเส้นผ่านศูนย์กลางของต้นไม้ แต่ระยะห่างระหว่าง v
ถึง w
(ฟังก์ชันของคุณกำลังทำอยู่) ไม่รับประกันว่าจะเป็นเส้นผ่านศูนย์กลาง
หากต้องการให้ฟังก์ชันคำนวณเส้นผ่านศูนย์กลาง คุณจะต้องทำให้มันส่งกลับจุดยอดที่พบพร้อมกับระยะทาง เพื่อความสะดวก มันจะเป็นองค์ประกอบสุดท้ายที่คุณประมวลผลเสมอ ดังนั้นเพียงทำให้ฟังก์ชันของคุณจดจำองค์ประกอบสุดท้ายที่ประมวลผลควบคู่ไปกับระยะห่างจากองค์ประกอบนั้น แล้วส่งคืนทั้งสององค์ประกอบ จากนั้นเรียกใช้ฟังก์ชันของคุณสองครั้ง อันดับแรกจากจุดยอดใดก็ได้ จากนั้นจึงเรียกจากจุดยอดที่มีการเรียกครั้งแรกกลับมา
เพื่อให้ค้นหาจุดศูนย์กลางได้จริงๆ คุณยังสามารถจดจำพาเรนต์สำหรับแต่ละโหนดในระหว่าง BFS ของคุณได้ ในการทำเช่นนั้น ให้จัดสรรอาร์เรย์เพิ่มเติม พูด prev
และเมื่อคุณทำเช่นนั้น
dist[nghbr] = dist[pos] + 1;
ทำเช่นกัน
prev[nghbr] = pos;
จากนั้น เมื่อสิ้นสุดการเรียกฟังก์ชันครั้งที่สอง คุณสามารถเลื่อนลงมาเป็น bdist/2 ครั้งใน prev ได้ เช่น:
center = lastVertex;
for (int i = 0; i + i < bdist; ++ i) center = prev[center];
ดังนั้น ด้วยการปรับแต่งฟังก์ชันของคุณเล็กน้อย (ทำให้ฟังก์ชันส่งคืนจุดยอดที่ไกลที่สุดจาก v
และจุดยอดที่อยู่ตรงกลางของเส้นทางนั้น และไม่ส่งคืนเส้นผ่านศูนย์กลางเลย) โค้ดนี้มีแนวโน้มที่จะส่งคืนจุดศูนย์กลางของแผนผังให้คุณ (ฉันทดสอบกับตัวอย่างของคุณเท่านั้น ดังนั้นอาจมีข้อผิดพลาดบางอย่าง)
pair<int, int> biggest_dist(int n, int v, const vector< vector<int> >& graph)
{
int INF = 2 * graph.size(); // Bigger than any other length
vector<int> dist(n, INF);
vector<int> prev(n, INF);
dist[v] = 0;
queue<int> next;
next.push(v);
int bdist = 0; //biggest distance
int lastV = v;
while (!next.empty()) {
int pos = next.front();
next.pop();
bdist = dist[pos];
lastV = pos;
for (int i = 0; i < graph[pos].size(); ++i) {
int nghbr = graph[pos][i];
if (dist[nghbr] > dist[pos] + 1) {
dist[nghbr] = dist[pos] + 1;
prev[nghbr] = pos;
next.push(nghbr);
}
}
}
int center = lastV;
for (int i = 0; i + i < bdist; ++ i) center = prev[center];
return make_pair(lastV, center);
}
int getCenter(int n, const vector< vector<int> >& graph)
{
// first call is to get the vertex that is furthest away from vertex 0, where 0 is just an arbitrary vertes
pair<int, int> firstResult = biggest_dist(n, 0, graph);
// second call is to find the vertex that is furthest away from the vertex just found
pair<int, int> secondResult = biggest_dist(n, firstResult.first, graph);
return secondResult.second;
}
person
Ishamael
schedule
17.01.2015