Daha bir ağac məsələsi
Bir qraf zirvədən ibarətdir. Əvvəlcə bu qraf boşdur. Sizə sorğunu emal etmək tapşırılıb:
zirvəsindən zirvəsinə kənar əlavə edin, burada və zirvələri müxtəlif ağaclarda yerləşir və zirvəsi hansısa ağacın köküdür.
İki zirvə və üçün onların eyni ağacda olub-olmadığını müəyyən edin.
Problemin həlli
Yolların sıxılması ilə DSU (Disjoint Set Union) alqoritmini tətbiq edək:
int n, m, l[NMAX]; int calc_leader (int v) { if (l[v] != v) l[v] = calc_leader(l[v]); return l[v]; } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) l[i] = i; for (int i = 1; i <= m; i++) { int x, y, z; scanf("%d%d%d", &z, &x, &y); if (z == 1) l[y] = x; else if (calc_leader(x) == calc_leader(y)) printf("YES\n"); else printf("NO\n"); } }
Siz bu həllin uzun müddət işləyəcəyi bir test hazırlamalısınız. Daha dəqiq desək, calc_leader
funksiyasının çağırışlarının sayı -dən az olmayacaq bir test hazırlamalısınız.
Giriş verilənləri
Giriş faylı iki tam ədəd və (, , ) ehtiva edir.
Çıxış verilənləri
sətir çıxarın. -ci sətir şəklində olmalıdır, əgər -ci sorğu zirvəsindən zirvəsinə kənar əlavə etməkdən ibarətdirsə, və ya şəklində olmalıdır, əgər soruşulursa, və zirvələri eyni ağacda yerləşir.