Redaksiya
funksiyası vasitəsilə zirvəsi köklü olan alt ağacda yolların keyfiyyətini yaxşılaşdırmağın neçə üsulu olduğunu bildirək. ilə zirvəsinin övladını işarə edək.
Əgər yolu pis qalırsa, onda kökü zirvəsi olan alt ağacın bütün yolları yaxşılaşdırılmalıdır.
Əgər yolunu yaxşılaşdırsaq, onda kökü zirvəsi olan alt ağacda yolların keyfiyyətini yaxşılaşdırmağın üsullarının sayı -ya bərabərdir.
Tutaq ki, — -nin övladlarıdır. O zaman
Əgər yarpaqdırsa (övladı olmayan zirvə), onda qoyaq.
Nümunə
Şərtdə verilmiş nümunələri nəzərdən keçirək. Hər bir zirvəsi üçün qiymətini yazacağıq.
Birinci nümunədə yolların keyfiyyətini yaxşılaşdırmağın üsulu mövcuddur ki, bu da hər hansı bir şəhərdən -ə qədər olan yolda ən çoxu bir pis yolun mövcud olduğu vəziyyətləri təmsil edir. Pis yollar qırıq xəttlərlə, yaxşı yollar isə dəstəklərlə göstərilib.
Alqoritmin tətbiqi
Bütün hesablama əməliyyatları moduluna əsasən həyata keçirilir.
#define MOD 1000000007
dfs funksiyası zirvəsi köklü olan alt ağacda yolların keyfiyyətini yaxşılaşdırmağın neçə üsulu olduğunu bildirən funksiyasının qiymətini hesablayır. zirvəsinin əcdadı olur.
long long dfs(int v, int p = -1) { long long s = 1;
Əgər — -nin övladlarıdırsa, onda
for (int to : g[v]) if (to != p) { long long sub = dfs(to, v); s = (s * (sub + 1)) % MOD; } return s; }
Giriş məlumatlarını oxuyuruq. Ağacı qururuq.
scanf("%d", &n); g.resize(n + 1); for (i = 2; i <= n; i++) { scanf("%d", &p); g[i].push_back(p); g[p].push_back(i); }
Nəticəni hesablamaq və çıxışa vermək.
res = dfs(1); printf("%lld\n", res);