Ukazuje sa, že ľudia nie sú jediný druh, ktorý trpí fenoménom známym ako meškanie. V mravčej kolónii sa už niekoľko mesiacov vie o jednom ovocnom strome, ktorý by sa dal využiť ako perfektný zdroj potravy. Zatiaľ k tomu ale nedošlo, pretože plány na logistické zvládnutie tejto operácie, ako inak, meškajú. Problém ale je, že schopnosti mravcov nie sú úplne dostačujúce na zvládnutie tejto úlohy, preto to nechali na vás.1
Ovocný strom má $n$ vrcholov, ktoré sú spojené $n-1$ hranami, po ktorých dokážu chodiť mravce. Zároveň platí, že z ľubovoľného vrcholu sa dá dostať do ľubovoľného iného práve jedným spôsobom.
Na strome existuje $2k$ vrcholov v ktorých majú začínať a končiť zásobovacie trasy. Tieto vrcholy voláme špeciálne. Konkrétne, mravce by medzi nimi chceli vytvoriť $k$ zásobovacích trás, pričom konce každej zásobovacej trasy sú špeciálne vrcholy. Každý špeciálny vrchol by mal patriť do presne jeden zásobovacej trasy. Lenže, ako možno viete, mravce sa orientujú pomocou chemických značiek. Preto sa cesty nesmú pretínať a to ani vrcholmi ani hranami, inak by sa mravce poplietli a meškali by ešte viac.
Na to, aby mohli začať značkovanie chodníkov, mravce potrebujú vlastne vedieť, akú najmenšiu celkovú dĺžku všetkých $k$ ciest vedia docieliť.
Zistite to, inak je útok na špajzu zaručený!
V prvom riadku vstupu je číslo $n$ ($2 \leq n \leq 10^5$) udávajúce celkový počet vrcholov a číslo $k$ ($2 \leq 2k \leq n$) udávajúce počet mravčích ciest.
V druhom riadku vstupu je $2k$ čísel $s_i$ ($0 \leq s_i \leq n-1$), špeciálne vrcholy.
Nasleduje $n-1$ riadkov. Na každom sú 2 čísla $a,b$ ($0 \leq a,b \leq n-1$), vrcholy spojené hranou.
| Sada | Obmedzenia |
|---|---|
| 1 | Všetky vrcholy ležia na jednej ceste |
| 2 | $n=2k$ |
| 3 | $n \leq 10$ |
| 4 | Bez žiadnych ďalších obmedzení |
Pokiaľ sa dá na strome postaviť $k$ ciest, tak, aby každá cesta začína a končí špeciálnom vrchole, pričom žiadne dve cesty nezdieľajú hranu ani vrchol (vrátane koncov), vypíšte jedno číslo: najmenšiu celkovú dĺžku takýchto ciest. Dĺžka cesty je počet hrán.
Pokiaľ sa takéto cesty nedajú postaviť, vypíšte $-1$.
3 1
1 2
0 1
2 0
2
Tento vstup sa môže nachádzať v 1. sade. Jediná cesta je z 1 cez 0 do 2.
4 2
0 1 2 3
1 0
2 0
3 0
-1
Aspoň dva z vrcholov $1,2,3$ musia byť konce jednej cesty. Na tejto ceste ale musí ležať vrchol $0$. Lenže ten musí byť súčasťou inej cesty. Z toho vyplýva, že riešenie neexistuje. Tento vstup sa môže nachádzať v 2. sade.
6 2
3 2 5 0
2 4
0 4
5 3
4 1
5 4
3
Cesty budú medzi vrcholmi $2$ a $0$, a $3$ a $5$. Všimnite si, že nemusia byť popárované v poradí, v akom prišli na vstup.
Musíte to urobiť, inak zaútočia na vašu špajzu a odnesú z nej všetko, čo má nenulový obsah cukru. ↩
V tejto podúlohe tvorí celý strom jednu cestu. Môžeme si teda vrcholy predstaviť usporiadané zľava doprava a postupne nimi prechádzať.
Keďže každý zo špeciálnych vrcholov musí patriť do práve jednej zásobovacej cesty, počas prechodu si stačí pamätať 2 veci:
Na začiatku sme mimo cesty. Keď prídeme do špeciálneho vrcholu, musíme začať novú cestu alebo ukončiť práve prebiehajúcu cestu. Ak sa po prechode do ďalšieho vrcholu nachádzame na aktívnej ceste, hrana medzi týmito dvoma vrcholmi patrí do riešenia a teda pripočítame 1 k celkovej dĺžke ciest. Takto postupne prejdeme celý strom.
Výsledkom je počet hrán, ktoré ležia medzi prvým a druhým špeciálnym vrcholom, medzi tretím a štvrtým atď.
V tejto podúlohe platí $2k = n$, teda každý vrchol stromu je špeciálny.
Ak by nejaká zásobovacia cesta mala aspoň 2 hrany, obsahovala by aj nejaký vnútorný vrchol. Keďže všetky vrcholy sú špeciálne, tento vrchol by bol tiež špeciálny, a preto by musel byť koncom svojej vlastnej zásobovacej cesty čo by v tomto prípade nebol. Preto musí mať každá zásobovacia cesta práve jednu hranu.
Z toho vieme vydudekovať, že v skutočnosti hľadáme úplné párenie stromu a to sa dá spraviť greedy jedným DFS prechodom.
To či sa to dá teda vieme zistiť tak, že najprv vojdeme DFS-kom do listov. Tie nemôžu byť spárené s ničím iným než ich rodičom a teda ich spárime. Následne keď budeme stúpať po strome a narazíme na nespárený vrchol, tiež ho spárime s jeho rodičom. Takto prejdeme celý strom a ak sa nikdy nepokúsime spáriť 1 rodiča dva krát, môžme si byť istý, že to ide.
Keďže každá cesta bude mať 1 hranu, súčet dĺžok ciest musí byť $k$ ak sa to dá. Teda veľmi ľahko získame výsledok.
Zoberme si inšpiráciu z 1. a 2. podúlohy a prejdime graf DFS-kom, pričom budeme propagovať koľko máme aktuálne aktívnych ciest. Strom budeme prechádzať postupne od listov. Pritom sa nám môže stať, že spropagujeme rôzne počty aktívnych ciest:
Počas tohoto procesu prechádzania stromu si navyše pamätáme celkovú dĺžku ciest a to tak, že keď sa nachádzame na vrchole, ktorý je začiatok, koniec alebo vrchol, ktorý cestu len propaguje ďalej, pridáme 1 k celkovému počtu vrcholov ciest. Tých bude na konci celková dĺžka ciest plus $k$, teda stačí odčítať $k$.
Časová zložitosť je $O(n)$ a pamäťová je tiež $O(n)$, lebo musíme prečítať celý vstup. Toto platí pre všetky 3 podúlohy vo vzorovom riešení.
Korešpondenčný seminár z programovania zastrešuje občianske združenie Trojsten.
Trojsten, o.z.
FMFI UK, Mlynská dolina
842 48 Bratislava
Programátorská súťaž pre základoškolákov
Materiály a úlohy na výučbu programovania
Intenzívny programátorský zážitok v lete