Faktanya, fungsi ini tidak menghitung diameter. Ini menghitung simpul terjauh dari simpul tertentu v
.
Untuk menghitung diameter pohon, pertama-tama Anda harus memilih titik sembarang (misalkan v
), kemudian cari titik sudut yang terjauh dari v
(katakanlah w
), lalu cari titik sudut yang terjauh dari w
, ayo duduk u
. Jarak antara w
dan u
adalah diameter pohon, namun jarak antara v
dan w
(apa yang dilakukan fungsi Anda) tidak dijamin menjadi diameternya.
Untuk membuat fungsi Anda menghitung diameter, Anda harus mengembalikan titik sudut yang ditemukan bersamaan dengan jarak. Mudahnya, ini akan selalu menjadi elemen terakhir yang Anda proses, jadi buatlah fungsi Anda mengingat elemen terakhir yang diproses bersamaan dengan jarak ke elemen tersebut, dan kembalikan keduanya. Kemudian panggil fungsi Anda dua kali, pertama dari titik sembarang, lalu dari titik di mana panggilan pertama dikembalikan.
Untuk membuatnya benar-benar menemukan pusatnya, Anda juga dapat mengingat induk untuk setiap node selama BFS Anda. Untuk melakukannya, alokasikan array tambahan, misalnya prev
, dan kapan Anda melakukannya
dist[nghbr] = dist[pos] + 1;
juga melakukan
prev[nghbr] = pos;
Kemudian di akhir panggilan kedua ke fungsi tersebut, Anda cukup turunkan bdist/2 kali ke sebelumnya, seperti:
center = lastVertex;
for (int i = 0; i + i < bdist; ++ i) center = prev[center];
Jadi dengan sedikit penyesuaian pada fungsi Anda (membuatnya mengembalikan simpul terjauh dari v
dan simpul yang berada di tengah jalur tersebut, dan tidak mengembalikan diameter sama sekali), kode ini kemungkinan akan mengembalikan Anda ke tengah pohon (Saya hanya mengujinya pada contoh Anda, jadi mungkin ada beberapa kesalahan satu per satu)
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