#!/usr/bin/python3 """V tomto řešení používáme tzv. procházení grafu do šířky, o kterém si můžete přečíst v naší grafové kuchařce: https://ksp.mff.cuni.cz/viz/kucharky/grafy """ from collections import deque # Deque (double-ended queue) je struktura, která se mj. umí chovat jako fronta, # tj. rychle přidávat prvky na svůj konec a odebírat prvky ze svého začátku def intlist(): """Přečte řádek mezerou oddělených čísel a vrátí ho jako seznam""" return list(map(int, input().split())) # Načteme N a M na prvním řádku N, M = intlist() # Načteme N řádků s kamarády kamaradi = [intlist() for i in range(N)] def spocti_podrizene(vedouci, kamaradi): """Pokud vedouci bude vedoucím, kolik bude mít každý pracovník pomocníků?""" q = deque([vedouci]) # Fronta pracovníků # Vzdálenosti pracovníků od vedoucího nebo None, pokud jsme vzdálenost ještě nespočítali vzdalenosti = [None] * N vzdalenosti[vedouci] = 0 # Vedoucí je sám od sebe vzdálen 0 # Na chvíli zapomeneme na podmínku o vybírání nadřízeného s nejmenším # číslem a jen pro každého pracovníka spočítáme, jak bude daleko od # vedoucího while q: # Dokud je fronta neprázdná v = q.popleft() # Vezmeme její první prvek, nějakého pracovníka for u in kamaradi[v]: # Vezmeme každého jeho kamaráda if vzdalenosti[u] is None: # Pokud jsme kamarádovi ještě nenastavili vzdálenost # Nastavíme ji o jedna větší než vzdálenost do zpracovávaného # pracovníka (ta je nejkratší, takže i vzdálenost do kamaráda # bude nejkratší) vzdalenosti[u] = vzdalenosti[v] + 1 q.append(u) # Přidáme kamaráda na konec fronty # Ve vzdalenosti jsou teď vzdálenosti každého vrcholu od vedoucího, popř. # nějaká None, pokud jsme se k daným spolužákům nedostali. pocty = [0] * N # Počty pomocníků (podřízených) for v in range(N): # Pro každého pracovníka if vzdalenosti[v] is None: # Pokud spolužáka nikdo neoslovil continue # Není součástí projektu a nebudeme ho dále řešit # Jinak chceme pro každého pracovníka najít jeho nadřízeného a přičíst mu jedničku if v == vedouci: continue # Vedoucí nemá nadřízeného # Projdeme všechny možné nadřízené, tj. všechny kamarády pracovníka, # kteří mají vzdálenost k vedoucímu o jedna menší než náš pracovník, a # vybereme z nich toho s nejmenším číslem nadrizeny = min(u for u in kamaradi[v] if vzdalenosti[u] == vzdalenosti[v] - 1) pocty[nadrizeny] += 1 # Započítáme se do počtu podřízených return pocty for i in range(M): vedouci, zajima_nas = intlist() podrizenych = spocti_podrizene(vedouci, kamaradi) # podrizenych[v] ... kolik ma pracovník v podřízených při vedoucím vedouci print(podrizenych[zajima_nas])