#include #include // Jednosmerny spojovy seznam struct hrana { int cil, delka; struct hrana *dalsi; }; // Pripravime si potrebne misto struct hrana *vrcholy [333333], cesty [333333]; int N, i; long long int maxdelka; long long int najdi_nejdelsi(int odkud, int kam) { long long int maxhloubka = 0, hloubka; for (struct hrana * c = vrcholy[kam]; c != NULL; c = c->dalsi) { if (c->cil != odkud) { hloubka = najdi_nejdelsi(kam, c->cil) + c->delka; // Pokud dosud nejhlubsi s prave proslou tvori maximum if (hloubka + maxhloubka > maxdelka) maxdelka = hloubka + maxhloubka; // Prubezne udrzujeme maximalni hloubku if (hloubka > maxhloubka) maxhloubka = hloubka; } } return maxhloubka; } int main() { scanf("%d\n", &N); int k, d; // Cteni krizovatek a slepych cest for (int i = 1; i < N; i++) { scanf("%d %d\n", &k, &d); cesty[i].cil = i; cesty[i].delka = d; // Pripojime ke spojaku - na zacatek cesty[i].dalsi = vrcholy[k]; vrcholy[k] = &cesty[i]; } maxdelka = 0; najdi_nejdelsi(0, 0); printf("%lld\n", maxdelka); return 0; }