#include #include #define MAXN 1000 #define MAXM 1000 /* Zásobník */ struct ze { int prvek; struct ze *dalsi; }; static int vrchol(struct ze *ceho) { if (!ceho) return 0; return ceho->prvek; } static void vloz(struct ze **kam, int co) { struct ze *nw = malloc(sizeof(*nw)); nw->prvek = co; nw->dalsi = *kam; *kam = nw; } static void odeber(struct ze **odkud) { struct ze *a = *odkud; *odkud = a->dalsi; free(a); } /* Popis úředníka */ typedef struct { int nadr; /* Přímý nadřízený */ int podr; /* Číslo prvního z podřízených, 0 jestliže žádní nejsou */ int kolega; /* Následující prvek v seznamu podřízených úředníka NADR, 0 jestliže neexistuje */ int ukon; /* Prováděný úkon */ int uzit; /* Je prokazatelně užitečný? */ int pozvs; /* Pozice v poli reprezentujícím množinu S; -1 jestliže není v S */ } urednik; static int n, m; static urednik urednici[MAXN + 1]; static struct ze *z[MAXM + 1]; static int s[MAXN]; static int slen; static void vyrad_ze_s(int k) { int pos = urednici[k].pozvs, prep; if (pos == -1) return; prep = s[slen - 1]; urednici[prep].pozvs = pos; s[pos] = prep; urednici[k].pozvs = -1; slen--; } static void vloz_do_s(int k) { urednici[k].pozvs = slen; s[slen++] = k; } static void pruchod(int k) { int i, p = 0, u = urednici[k].ukon; if (u == 1) { urednici[k].uzit = 1; for (i = 0; i < slen; i++) { urednici[s[i]].uzit = 1; urednici[s[i]].pozvs = -1; } slen = 0; } else { p = vrchol(z[u]); if (p) vyrad_ze_s(p); vloz(&z[u], k); vloz_do_s(k); } for (i = urednici[k].podr; i; i = urednici[i].kolega) pruchod(i); if (u != 1) { vyrad_ze_s(k); odeber(&z[u]); if (p && !urednici[p].uzit) vloz_do_s(p); } } int main(void) { int i; const char *sep = ""; urednici[1].pozvs = -1; urednici[1].uzit = 1; urednici[1].podr = 0; urednici[1].kolega = 0; scanf("%d%d", &n, &m); for (i = 2; i <= n; i++) { scanf("%d%d", &urednici[i].nadr, &urednici[i].ukon); urednici[i].pozvs = -1; int nad = urednici[i].nadr; urednici[i].kolega = urednici[nad].podr; urednici[nad].podr = i; } for (i = urednici[1].podr; i; i = urednici[i].kolega) pruchod(i); for (i = 1; i <= n; i++) if (!urednici[i].uzit) { printf("%s%d", sep, i); sep = " "; } printf("\n"); return 0; }