Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
2477 – Tricolor
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
Tanaka are un arbore (un tri) cu <code>N</code> noduri numerotate de la <code>1</code> la <code>N</code>. El vrea să coloreze nodurile arborelui în alb sau negru astfel încât numărul de perechi (neordonate) de noduri înfrățite să fie maxim. Două noduri sunt înfrățite dacă și numai dacă ambele sunt albe și fie sunt legate direct printr-o muchie, fie lanțul elementar unic dintre ele conține doar noduri negre. = Cerința = Dându-se un arbore cu <code>N</code> noduri, să se afle numărul maxim de perechi de noduri înfrățite ale sale care se poate obține. = Date de intrare = Fișierul de intrare <code>tricolor.in</code> va conține pe primul rând un număr natural nenul <code>T</code> ce reprezintă numărul de teste. Urmează <code>T</code> teste, fiecare test va descrie un arbore pentru care trebuie să se rezolve cerința. Pe primul rând al unui test apare un număr natural <code>N</code> ce reprezintă numărul de noduri ale arborelui din testul respectiv. Pe următoarele <code>N-1</code> rânduri vor apărea câte o pereche de numere întregi <code>x y</code> separate printr-un spațiu, care indică existența unei muchii între nodul <code>x</code> și nodul <code>y</code>. = Date de ieșire = Fișierul de ieșire <code>tricolor.out</code> va conține <code>T</code> rânduri. Fiecare rând va conține soluția pentru câte un test, în aceeași ordine ca în fișierul de intrare. = Restricții și precizări = * <code>1 ≤ T ≤ 10</code> * <code>1 ≤ N ≤ 5 000</code> * Într-un test oarecare, <code>1 ≤ x, y ≤ N</code>, <code>x ≠ y</code> * Pentru <code>5</code> puncte, <code>T = 1</code> și <code>N ≤ 15</code> * Pentru alte <code>10</code> puncte, <code>T = 1</code> și <code>N ≤ 20</code> * Pentru alte <code>5</code> puncte, toți arborii descriși au exact <code>2</code> frunze și <code>N ≤ 500</code> * Pentru alte <code>10</code> puncte, pentru toți arborii descriși există exact două noduri ale arborelui de care se leagă toate frunzele, situate la capetele unui lanț elementar și <code>N ≤ 500</code>. * Pentru alte <code>50</code> de puncte, <code>N ≤ 500</code> * Pentru alte <code>20</code> de puncte, nu există restricții suplimentare. = Exemplu: = <code>tricolor.in</code> 2 8 1 2 2 3 2 4 4 5 5 6 6 7 6 8 2 1 2 <code>tricolor.out</code> 7 1 === Explicație === <code>T = 2</code>, avem două teste în fișierul de intrare. În primul test arborele are <code>8</code> noduri și cu o colorare optimă putem obține un număr maxim de <code>7</code> perechi de noduri înfrățite. Perechile înfrățite sunt: <code>(1, 3)</code>, <code>(1, 4)</code>, <code>(3, 4)</code>, <code>(4, 5)</code>, <code>(5, 7)</code>, <code>(5, 8)</code>, <code>(7, 8)</code>. În al doilea test arborele are <code>2</code> noduri legate cu o singură muchie. Este optim să colorăm ambele noduri în alb obținând o pereche de noduri înfrățite. == Rezolvare == <syntaxhighlight lang="python3"> from collections import defaultdict def maxFriendPairs(N, edges): graph = defaultdict(list) for u, v in edges: graph[u].append(v) graph[v].append(u) def dfs(node, parent): nonlocal ans black_count = 0 white_count = 1 for child in graph[node]: if child != parent: black_subtree_count, white_subtree_count = dfs(child, node) black_count += white_subtree_count white_count += black_subtree_count ans = max(ans, black_count * (black_count - 1) // 2 + white_count * (white_count - 1) // 2) return black_count, white_count ans = 0 dfs(1, -1) return ans def main(): with open("tricolor.in", "r") as fin, open("tricolor.out", "w") as fout: T = int(fin.readline()) for _ in range(T): N = int(fin.readline()) edges = [] for _ in range(N - 1): u, v = map(int, fin.readline().split()) edges.append((u, v)) fout.write(str(maxFriendPairs(N, edges)) + "\n") if __name__ == "__main__": main() </syntaxhighlight>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width