<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1974_-_TrumpLandia</id>
	<title>1974 - TrumpLandia - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1974_-_TrumpLandia"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1974_-_TrumpLandia&amp;action=history"/>
	<updated>2026-05-01T03:42:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1974_-_TrumpLandia&amp;diff=10081&amp;oldid=prev</id>
		<title>Danciu: Pagină nouă:  După o confruntare eroică, Trump a fost ales democratic președintele unei republici prospere, &#039;&#039;TrumpLandia&#039;&#039;. Natural, prima sa prioritate e să construiască o rețea de buncăre, pentru a veni în întâmpinarea unui atac al vecinilor imperaliști.  &lt;code&gt;N&lt;/code&gt; buncăre au fost deja construite. Trump trebuie să aleagă între &lt;code&gt;M&lt;/code&gt; posibile rute bidirecționale pentru a le conecta. Un plan de conectare este alcătuit dintr-un subset minim de astfel de leg...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1974_-_TrumpLandia&amp;diff=10081&amp;oldid=prev"/>
		<updated>2024-06-04T02:29:34Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă:  După o confruntare eroică, Trump a fost ales democratic președintele unei republici prospere, &amp;#039;&amp;#039;TrumpLandia&amp;#039;&amp;#039;. Natural, prima sa prioritate e să construiască o rețea de buncăre, pentru a veni în întâmpinarea unui atac al vecinilor imperaliști.  &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; buncăre au fost deja construite. Trump trebuie să aleagă între &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; posibile rute bidirecționale pentru a le conecta. Un plan de conectare este alcătuit dintr-un subset minim de astfel de leg...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
După o confruntare eroică, Trump a fost ales democratic președintele unei republici prospere, &amp;#039;&amp;#039;TrumpLandia&amp;#039;&amp;#039;. Natural, prima sa prioritate e să construiască o rețea de buncăre, pentru a veni în întâmpinarea unui atac al vecinilor imperaliști.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; buncăre au fost deja construite. Trump trebuie să aleagă între &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; posibile rute bidirecționale pentru a le conecta. Un plan de conectare este alcătuit dintr-un subset minim de astfel de legături, astfel încât din fiecare locație să se poată ajunge în orice altă locație. Costul unui plan este dat de suma distanțelor legăturilor.&lt;br /&gt;
&lt;br /&gt;
Deoarece rutele sunt vulnerabile la bombardamente aeriene, Trump vă cere să estimați un plan de cost minim. În plus, Trump vă cere să calculați &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; soluții de rezervă, pentru situația în care una dintre cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; legături este sigur inclusă în plan.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Datele de intrare vor fi citite din fișierul &amp;lt;code&amp;gt;trumplandia.in&amp;lt;/code&amp;gt;. Pe prima linie se află trei numere separate prin spațiu: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (numărul de buncăre), &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; (numărul de rute posibile), &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; (numărul de soluții de rezervă).&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află triplete de forma (&amp;lt;code&amp;gt;nod1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nod2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dist12&amp;lt;/code&amp;gt;) ce descriu o posibilă legătură între nodurile &amp;lt;code&amp;gt;nod1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;nod2&amp;lt;/code&amp;gt; cu distanța &amp;lt;code&amp;gt;dist12&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se află câte un număr &amp;lt;code&amp;gt;Qi&amp;lt;/code&amp;gt;, reprezentând indexul unei muchii care trebuie inclusă într-un plan de rezervă. (valorile se pot repeta)&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Datele de ieșire vor fi afișate în fișierul &amp;lt;code&amp;gt;trumplandia.out&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe prima linie se va afla un număr reprezentând costul celui mai bun plan, pentru situația în care pot fi folosite oricare dintre cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rute.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se află un număr &amp;lt;code&amp;gt;Ci&amp;lt;/code&amp;gt; reprezentând costul minim al unui plan care conține muchia &amp;lt;code&amp;gt;Qi&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 200.000&amp;lt;/code&amp;gt; (pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;N ≤ 1000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;N-1 ≤ M ≤ 200.000&amp;lt;/code&amp;gt; (pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;M ≤ 1000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 300.000&amp;lt;/code&amp;gt; (pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;Q ≤ 1000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* distanța asociată unei rute este o valoare întreagă din intervalul &amp;lt;code&amp;gt;[1, 1.000.000.000]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
ATENȚIE!!! Între oricare două buncăre pot exista MAI MULTE rute de distanțe diferite sau nu. Exemplu: &amp;lt;code&amp;gt;(1 2 4)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(1 2 6)&amp;lt;/code&amp;gt; sunt două muchii între buncărele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; de distanțe &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;trumplandia.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 8 8&lt;br /&gt;
 1 2 4&lt;br /&gt;
 4 1 6&lt;br /&gt;
 3 1 2&lt;br /&gt;
 2 3 3&lt;br /&gt;
 5 2 4&lt;br /&gt;
 3 4 3&lt;br /&gt;
 4 5 5&lt;br /&gt;
 5 6 1&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 4&lt;br /&gt;
 5&lt;br /&gt;
 6&lt;br /&gt;
 7&lt;br /&gt;
 8&lt;br /&gt;
&amp;lt;code&amp;gt;trumplandia.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 13&lt;br /&gt;
 14&lt;br /&gt;
 16&lt;br /&gt;
 13&lt;br /&gt;
 13&lt;br /&gt;
 13&lt;br /&gt;
 13&lt;br /&gt;
 14&lt;br /&gt;
 13&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;trumplandia.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    N, M, Q = map(int, fin.readline().split())&lt;br /&gt;
    edges = [tuple(map(int, fin.readline().split())) for _ in range(M)]&lt;br /&gt;
    reserve_edges = [int(fin.readline()) for _ in range(Q)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find(parent, node):&lt;br /&gt;
    if parent[node] == node:&lt;br /&gt;
        return node&lt;br /&gt;
    parent[node] = find(parent, parent[node])&lt;br /&gt;
    return parent[node]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def union(parent, rank, x, y):&lt;br /&gt;
    x = find(parent, x)&lt;br /&gt;
    y = find(parent, y)&lt;br /&gt;
    if x == y:&lt;br /&gt;
        return False&lt;br /&gt;
    if rank[x] &amp;lt; rank[y]:&lt;br /&gt;
        parent[x] = y&lt;br /&gt;
    elif rank[x] &amp;gt; rank[y]:&lt;br /&gt;
        parent[y] = x&lt;br /&gt;
    else:&lt;br /&gt;
        parent[y] = x&lt;br /&gt;
        rank[x] += 1&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def kruskal(edges, N):&lt;br /&gt;
    edges.sort(key=lambda x: x[2])  &lt;br /&gt;
&lt;br /&gt;
    parent = list(range(N + 1))  &lt;br /&gt;
    rank = [0] * (N + 1) &lt;br /&gt;
    min_cost = 0  &lt;br /&gt;
&lt;br /&gt;
    mst_edges = []  &lt;br /&gt;
&lt;br /&gt;
    for edge in edges:&lt;br /&gt;
        u, v, cost = edge&lt;br /&gt;
        if find(parent, u) != find(parent, v):&lt;br /&gt;
            union(parent, rank, u, v)&lt;br /&gt;
            min_cost += cost&lt;br /&gt;
            mst_edges.append(edge)&lt;br /&gt;
&lt;br /&gt;
    return min_cost, mst_edges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
min_cost, mst_edges = kruskal(edges, N)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
adj_list = {i: [] for i in range(1, N + 1)}&lt;br /&gt;
for edge in mst_edges:&lt;br /&gt;
    u, v, cost = edge&lt;br /&gt;
    adj_list[u].append((v, cost))&lt;br /&gt;
    adj_list[v].append((u, cost))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;trumplandia.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    fout.write(str(min_cost) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
    for reserve_edge in reserve_edges:&lt;br /&gt;
        reserve_cost = min_cost  &lt;br /&gt;
&lt;br /&gt;
        if reserve_edge not in [edge[:2] for edge in mst_edges]:&lt;br /&gt;
            u, v, cost = edges[reserve_edge - 1]&lt;br /&gt;
            for edge in mst_edges:&lt;br /&gt;
                if edge[0] == u or edge[1] == u or edge[0] == v or edge[1] == v:&lt;br /&gt;
                    reserve_cost += cost - edge[2]&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(reserve_cost) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
</feed>