Qrafın topoloji sıralamasını tapaq. ilə təpəsindən başlayaraq yol boyunca ziyarət edilə biləcək maksimum şəhər sayını göstərək.
Təpələri topoloji sıralama ardıcıllığında nəzərdən keçirək. cari təpə olsun. v_1, v_2, ..., v_k ilə -dan çıxan kənarların apardığı təpələri göstərək. Beləliklə, aşağıdakı dəyəri yeniləyək:
Əvvəlcə dp[u] = 0~(1 \le u \le n) quraraq başlayırıq.
Bütün təpələri işlətdikdən sonra massivində ən böyük dəyəri tapırıq. Bu, qrafda ən uzun yolun uzunluğuna bərabərdir.
Nümunə
Solda birinci nümunədən qraf göstərilmişdir. Sağda isə ikincidən. Ən uzun yollar vurğulanmışdır.
Birinci nümunədə ən uzun yol dp_1 = 3-ə bərabərdir.
İkinci nümunədə ən uzun yol dp_4 = 2-ə bərabərdir.
Alqoritmanın reallaşdırılması
Qrafın əlaqə siyahısını elan edək .
vector<vector<int> > g;dfs funksiyası təpəsindən başlayaraq dərinlik üzrə axtarış icra edir. Qraf təpələrini topoloji olaraq sıralayır və onları massivinə yazır.
void dfs(int v)
{
used[v] = 1;
for (int to : g[v])
if (used[to] == 0) dfs(to);
top.push_back(v);
}Proqramın əsas hissəsi. Giriş məlumatlarını oxuyuruq. Yönümlü qrafın əlaqə siyahısını qururuq.
scanf("%d %d", &n, &m);
g.resize(n + 1);
while (m--)
{
scanf("%d %d", &a, &b);
g[a].push_back(b);
}Əlaqəsiz qrafda axtarış icra edirik.
used.resize(n + 1);
for (i = 1; i <= n; i++)
if (used[i] == 0) dfs(i);Topoloji sıralamaya əks şəkildə qrafın təpələrini nəzərdən keçiririk, yəni massivinin elementlərini soldan sağa doğru mətrix edirik.
dp.resize(n + 1);
for (int u : top)
{təpəsindən özünə yolun uzunluğu -dəkdir (başlatma).
dp[u] = 0;ilə əlaqəli olan təpələrini nəzərdən keçirək. kənarını nəzərdən keçiririk.
for (int v : g[u])Bütün belə təpələri üçün dp[v] + 1 qiymətləri arasında maksimumu axtarırıq.
dp[u] = max(dp[u], dp[v] + 1);
}massivində ən böyük elementi tapır və çıxış edirik. Bu, qrafdakı ən uzun yolun uzunluğuna uyğundur.
res = *max_element(dp.begin(), dp.end());
printf("%d\n", res);