Ağacın diametri#11428

Ağacın diametri (Həll təhlili)

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:

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]);