#include #include struct vrchol_t { int kryje; // Koho kryje int pokryti; // Kolik ho kryje bool pouzity; // Už jsme ho zpracovali? }; int main(int argc, char *argv[]) { // Napřed krapet načítání int pocet; scanf("%d", &pocet); struct vrchol_t vrcholy[pocet]; for(int i = 0; i < pocet; ++ i) { int kryje; scanf("%d", &kryje); vrcholy[i] = (struct vrchol_t) { .kryje = kryje - 1 // C čísluje od 0 }; } // Předpočítat vstupní stupně a roztřídit do hromádek for(int i = 0; i < pocet; ++ i) ++ vrcholy[vrcholy[i].kryje].pokryti; int nekrytych = 0, nekryti[pocet]; for(int i = 0; i < pocet; ++ i) if(vrcholy[i].pokryti == 0) nekryti[nekrytych ++] = i; // Nyní, dokud nedojdou vrcholy, tak hurá na věc while(pocet) { // Vybereme ze správné hromádky - předně z nekrytých int aktualni = nekrytych ? nekryti[-- nekrytych] : -- pocet; if(vrcholy[aktualni].pouzity) // Toho už známe, jiného continue; // Tento do zálohy vrcholy[aktualni].pouzity = true; // Vezmeme toho, koho kryje int kryty = vrcholy[aktualni].kryje; if(vrcholy[kryty].pouzity) // Někdy už jsme ho zpracovali, nezpracovávat znovu continue; // Poslat do útoku printf("%d\n", kryty + 1); vrcholy[kryty].pouzity = true; // Odečíst od toho, koho kryje útočící, když je nekrytý, // šup do hromádky if(-- vrcholy[vrcholy[kryty].kryje].pokryti == 0) nekryti[nekrytych ++] = vrcholy[kryty].kryje; } return 0; }