Ağacın diametri ağacdakı ən uzun yolun uzunluğudur. Başqa sözlə, aralarındakı məsafə maksimal olan iki və təpəsini tapmalıyıq.
Bu məsələni həll etmək üçün aşağıdakı alqoritmdən istifadə edək:
Əvvəlcə ağacın istənilən təpəsindən, məsələn -ci təpədən başlayaraq dərinliyinə axtarış aparaq. Bu gəzinti zamanı başlanğıc nöqtədən maksimal məsafədə olan təpəni tapın. Bu təpəni ilə işarə edin.
Sonra, bu dəfə təpəsindən başlayaraq yenidən dərinliyinə axtarış aparın. Bu gəzintinin nəticəsində -dan ən uzaqda olan təpəni tapın və onu ilə işarə edin.
Bu zaman və təpələri arasındakı məsafə ağacdakı bütün təpə cütləri arasında maksimaldır və deməli, ağacın diametrinə bərabərdir.
Misal
Misaldan olan ağacı nəzərdən keçirək.
Ağacın diametri -dür. Maksimal məsafəyə, məsələn, və təpələri arasında nail olunur.
Tapşırıq
Ağacın diametrini tapın.
Alqoritmin implementasiyası
Giriş ağacını qonşuluq siyahısında saxlayın. Mənbədən hər bir təpəyə qədər olan ən qısa məsafələri massivində saxlayın.
vector<vector<int>> g;
vector<int> dist;dfs funksiyası təpəsindən dərinliyinə axtarış həyata keçirir. Mənbədən təpəsinə qədər olan ən qısa məsafə -dir. Dərinliyinə axtarış zamanı təpəsinin valideyni -dir.
void dfs(int v, int d, int p = -1)
{Mənbədən təpəsinə qədər olan ən qısa məsafəni dist[v]-də saxlayın.
dist[v] = d;(v, to) bütün qırağları üzərindən gedin. təpəsinin hər bir oğlu üçün ( -nin valideyni olmadıqda) dərinliyinə axtarışı başladın. Mənbədən təpəsinə qədər olan məsafə d + 1 olacaq.
for (int to : g[v])
if (to != p) dfs(to, d + 1, v);
}Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.
scanf("%d", &n);
g.resize(n + 1);
dist.resize(n + 1);İstiqamətləndirilməmiş ağac qurun.
for (i = 1; i < n; i++)
{
scanf("%d %d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}-ci təpədən bütün digər təpələrə qədər olan ən qısa məsafələri tapın. Ondan ən uzaqda olan təpə -dır.
dfs(1, 0, -1);
a = max_element(dist.begin(), dist.begin() + n + 1) –
dist.begin();təpəsindən bütün digər təpələrə qədər olan ən qısa məsafələri tapın. Ondan ən uzaqda olan təpə -dir.
dfs(a, 0, -1);
b = max_element(dist.begin(), dist.begin() + n + 1) –
dist.begin();Ağacın diametrini — -dan -yə qədər olan ən qısa məsafəni çap edin.
printf("%d\n", dist[b]);