#include #include /** * 28-Z3-4 * Autor: Ondřej Hlavatý */ inline int max(int a, int b) { return a > b ? a : b; } struct uloha { unsigned id; int delka; int cas_splneni = -1; std::vector zavislosti; }; /** * Hlavní funkce. Spočítá čas splnění dané úlohy. * Pokud jej už zná, vráti jej hned. * Jinak spočítá pomocí rekurzivních volání. */ int cas_splneni(uloha *u) { if (u->cas_splneni >= 0) return u->cas_splneni; u->cas_splneni = 0; for (uloha *v : u->zavislosti) u->cas_splneni = max(u->cas_splneni, cas_splneni(v)); u->cas_splneni += u->delka; return u->cas_splneni; } int main() { // Načtení vstupu unsigned int N, M; scanf("%u %u\n", &N, &M); uloha ulohy [N]; for (unsigned int i = 0; i < N; i++) { ulohy[i].id = i; scanf("%u", &ulohy[i].delka); } for (unsigned int i = 0; i < M; i++) { unsigned int a, b; scanf("%u %u", &a, &b); ulohy[b].zavislosti.push_back(&ulohy[a]); } // Nyní spočteme maximum přes všechny úlohy int maximum = 0; for (uloha &u : ulohy) maximum = max(maximum, cas_splneni(&u)); printf("%i\n", maximum); }