Stich vrea să cartografieze arhipelagul Hawaii folosind scanerul navei sale. Arhipelagul este format din insule, numerotate cu numere naturale de la la , și poduri ce conectează câte două insule. În ultima misiune, scanerul s-a defectat, așa că poate să proceseze doar următorul tip de comandă: Stich alege o mulțime de insule, iar scanerul îi spune numărul maxim de insule dintre cele selectate ce pot fi vizitate plecând dintr-o insulă din multime, folosind doar podurile existente și nepărăsind niciodată mulțimea pe parcursul deplasării. Ajutați-l pe Stich să cartografieze arhipelagul, folosind de un număr relativ mic de ori scanerul!
Mai formal, se dă un graf neorientat cu noduri și muchii. La o interogare, concurentul va alege o submulțime de noduri din și va afla numărul maxim de noduri dintr-o componentă conexă a subgrafului format din nodurile submulțimii și muchiile dintre ele. Se cere aflarea grafului într-un număr relativ mic de interogații. Atenție! Inițial, concurentul știe doar valoarea lui , nu și pe cea a lui !
Protocol de interacțiune
Problema este interactivă. Concurentul va implementa functia solve cu urmatoarea semnatura:
void solve (int N, int subtask_id);
Parametrul reprezintă numărul de noduri din . Parametrul reprezintă indicele subtaskului pe care se rulează sursa concurentului (un număr întreg între și , inclusiv).
Concurentul se poate folosi de funcțiile query
și answer
cu următoarele semnături:
int query (const std::vector<int>& nodes);
void answer (const std::vector<std::pair<int, int>>& ans);
Funcția query
reprezintă o interogare. Parametrul nodes
conține indicii nodurilor pe care este realizată interogarea. Funcția întoarce mărimea componentei conexe maxime, așa cum este specificat în enunț. Nodurile se pot regăsi în orice ordine în .
Funcția answer
va fi apelată o singură dată de către concurent, după ce acesta a găsit muchiile grafului . Parametrul conține muchiile găsite de concurent, în orice ordine. Ordinea nodurilor în cadrul fiecărei muchii nu este importantă.
Concurentul NU va implementa o funcție main
.
Restricții
Fie numărul de interogări pe care le face concurentul și .
- .
- .
Subtask 1 (3 puncte)
- este un lanț.
- Dacă , atunci se acordă tot punctajul subtaskului.
Subtask 2 (1 punct)
- este un graf stea.
- Punctarea este aceeași ca la subtaskul precedent.
Subtask 3 (30 puncte)
- este un arbore.
- Toate nodurile lui au gradul cel mult .
- Dacă , atunci se acordă tot punctajul subtaskului.
- Dacă , atunci se acordă din punctajul subtaskului.
- Dacă , atunci se acordă din punctajul subtaskului.
- Dacă si , atunci se acordă punct pentru subtask.
Subtask 4 (30 puncte)
- este un arbore.
- Punctarea este aceeași ca la subtaskul precedent.
Subtask 5 (3 puncte)
- este un ciclu.
- Punctarea este aceeași ca la subtaskul precedent.
Subtask 6 (16 puncte)
- Toate nodurile lui au gradul cel mult .
- Dacă , atunci se acordă tot punctajul subtaskului.
- Dacă , atunci se acordă din punctajul subtaskului.
- Dacă , atunci se acordă din punctajul subtaskului.
- Dacă , atunci se acordă din punctajul subtaskului.
Subtask 7 (17 puncte)
- Nu există restricții suplimentare.
- Punctarea este aceeași ca la subtaskul precedent.
Exemple
Comisie:
Concurent: Query:
Comisie:
Concurent: Query:
Comisie:
Concurent: Query:
Comisie:
Concurent: Query:
Comisie:
Concurent: Answer: