<?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=4118_-_regate</id>
	<title>4118 - regate - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=4118_-_regate"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4118_-_regate&amp;action=history"/>
	<updated>2026-05-01T05:37:44Z</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=4118_-_regate&amp;diff=10088&amp;oldid=prev</id>
		<title>Danciu: Pagină nouă: În tărâmul ONI se află &lt;code&gt;N&lt;/code&gt; regate legate între ele prin &lt;code&gt;M&lt;/code&gt; muchii bidirecționale. Se garantează că se poate ajunge de la orice regat la oricare alt regat folosind aceste muchii. Aceste regate vor să facă alianțe între ele și se vor folosi de puncte de frontieră pentru a realiza acest lucru.  Fiecare muchie &lt;code&gt;i&lt;/code&gt;, unde &lt;code&gt;1 ≤ i ≤ M&lt;/code&gt;, are asociat un număr natural &lt;code&gt;c[i]&lt;/code&gt; reprezentând costul construcției unu...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4118_-_regate&amp;diff=10088&amp;oldid=prev"/>
		<updated>2024-06-04T03:27:09Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: În tărâmul ONI se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; regate legate între ele prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; muchii bidirecționale. Se garantează că se poate ajunge de la orice regat la oricare alt regat folosind aceste muchii. Aceste regate vor să facă alianțe între ele și se vor folosi de puncte de frontieră pentru a realiza acest lucru.  Fiecare muchie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt;, are asociat un număr natural &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt; reprezentând costul construcției unu...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;În tărâmul ONI se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; regate legate între ele prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; muchii bidirecționale. Se garantează că se poate ajunge de la orice regat la oricare alt regat folosind aceste muchii. Aceste regate vor să facă alianțe între ele și se vor folosi de puncte de frontieră pentru a realiza acest lucru.&lt;br /&gt;
&lt;br /&gt;
Fiecare muchie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt;, are asociat un număr natural &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt; reprezentând costul construcției unui punct de frontieră pe aceasta. Mai mult decât atât, fiecare regat &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;, are asociat un număr natural &amp;lt;code&amp;gt;r[i]&amp;lt;/code&amp;gt; reprezentând costul construcției unui punct de frontieră la intrarea acestuia.&lt;br /&gt;
&lt;br /&gt;
Pentru ca regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; să intre într-o alianță cu regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ X, Y ≤ N, X ≠ Y&amp;lt;/code&amp;gt;, acesta are două opțiuni:&lt;br /&gt;
&lt;br /&gt;
* construiește un punct de frontieră pe o singură muchie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; cu cost &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt;, astfel încât orice drum de la &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; trece prin acest punct de frontieră;&lt;br /&gt;
* construiește un punct de frontieră la intrarea regatului său (regatului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;) cu cost &amp;lt;code&amp;gt;r[X]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Evident, regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; va alege costul minim pentru a intra într-o alianță cu regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Vom nota acest cost minim cu &amp;lt;code&amp;gt;Cost(X, Y)&amp;lt;/code&amp;gt;. Atenție, costul ca regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; să intre într-o alianță cu regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; poate fi diferit de costul ca regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; să intre într-o alianță cu regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
Pentru ca regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; să fie într-o alianță perfectă acesta trebuie să facă alianță cu toate celalate regate.&lt;br /&gt;
&lt;br /&gt;
Atenție, în formarea unei alianțe nu se iau în considerare punctele de frontieră construite în formarea altor alianțe. Cu alte cuvinte, &amp;lt;code&amp;gt;Cost(X, Y)&amp;lt;/code&amp;gt; se calculează independent pentru fiecare pereche &amp;lt;code&amp;gt;(X, Y)&amp;lt;/code&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru fiecare regat trebuie să calculați costul pe care acesta trebuie să-l plătească pentru a fi într-o alianță perfectă. Cu alte cuvinte, pentru fiecare regat &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;, trebuie să calculați .&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fișierului de intrare &amp;lt;code&amp;gt;regate.in&amp;lt;/code&amp;gt; se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, numărul de regate, respectiv, numărul de muchii bidirecționale. Pe a doua linie se găsesc numerele &amp;lt;code&amp;gt;r[1]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;r[N]&amp;lt;/code&amp;gt;, separate prin spații, unde &amp;lt;code&amp;gt;r[i]&amp;lt;/code&amp;gt; reprezintă costul construcției unui punct de frontieră la intrarea regatului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află câte trei numere naturale &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt;, separate prin spații, &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt;, semnificând că există o muchie bidirecțională între regatul &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; și regatul &amp;lt;code&amp;gt;b[i]&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt; reprezintă costul construcției unui punct de frontieră pe muchia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul de ieșire &amp;lt;code&amp;gt;regate.out&amp;lt;/code&amp;gt; se vor afișa &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii. Fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține un singur număr întreg, reprezentând costul ce trebuie plătit pentru ca regatul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; să fie într-o alianță perfectă, cu alte cuvinte, .&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;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ c[i]≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ r[i] ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a[i], b[i] ≤ N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;a[i] ≠ b[i]&amp;lt;/code&amp;gt; (adică nu există muchie de la un regat la el insuși)&lt;br /&gt;
* Între două regate poate exista cel mult o muchie&lt;br /&gt;
* Datorită dimensiunilor foarte mari, doar o parte din teste au putut fi folosite.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;regate.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
 8 13 9 7 12&lt;br /&gt;
 1 2 10&lt;br /&gt;
 2 3 10&lt;br /&gt;
 3 4 10&lt;br /&gt;
 4 5 10&lt;br /&gt;
 1 3 10&lt;br /&gt;
&amp;lt;code&amp;gt;regate.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 32&lt;br /&gt;
 46&lt;br /&gt;
 36&lt;br /&gt;
 28&lt;br /&gt;
 40&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
De exemplu, pentru regatul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; avem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 1) = 13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 3) = 13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 4) = 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 5) = 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suma acestora este &amp;lt;code&amp;gt;46&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Atenție că, de exemplu, în calculul lui &amp;lt;code&amp;gt;Cost(2, 1)&amp;lt;/code&amp;gt;, nu putem pune un punct de frontieră pe muchia &amp;lt;code&amp;gt;(1 ,2)&amp;lt;/code&amp;gt; de cost &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, deoarece există drumul &amp;lt;code&amp;gt;2 → 3 → 1&amp;lt;/code&amp;gt; care nu trece prin muchia &amp;lt;code&amp;gt;(1, 2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
class Graph:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.n = n&lt;br /&gt;
        self.adj_list = [[] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    def add_edge(self, u, v, w):&lt;br /&gt;
        self.adj_list[u].append((v, w))&lt;br /&gt;
        self.adj_list[v].append((u, w))&lt;br /&gt;
&lt;br /&gt;
    def dijkstra(self, src):&lt;br /&gt;
        dist = [float(&amp;#039;inf&amp;#039;)] * self.n&lt;br /&gt;
        dist[src] = 0&lt;br /&gt;
        pq = [(0, src)]&lt;br /&gt;
&lt;br /&gt;
        while pq:&lt;br /&gt;
            cost, node = heapq.heappop(pq)&lt;br /&gt;
            if cost &amp;gt; dist[node]:&lt;br /&gt;
                continue&lt;br /&gt;
            for neighbor, edge_cost in self.adj_list[node]:&lt;br /&gt;
                new_cost = cost + edge_cost&lt;br /&gt;
                if new_cost &amp;lt; dist[neighbor]:&lt;br /&gt;
                    dist[neighbor] = new_cost&lt;br /&gt;
                    heapq.heappush(pq, (new_cost, neighbor))&lt;br /&gt;
        return dist&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citire date de intrare&lt;br /&gt;
    with open(&amp;quot;regate.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        r = list(map(int, fin.readline().split()))&lt;br /&gt;
        graph = Graph(N)&lt;br /&gt;
        for _ in range(M):&lt;br /&gt;
            a, b, c = map(int, fin.readline().split())&lt;br /&gt;
            graph.add_edge(a - 1, b - 1, c)&lt;br /&gt;
&lt;br /&gt;
    # Calcul costuri minime pentru fiecare regat&lt;br /&gt;
    total_costs = []&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        dist = graph.dijkstra(i)&lt;br /&gt;
        total_cost = 0&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            if i != j:&lt;br /&gt;
                min_edge_cost = min(edge_cost for neighbor, edge_cost in graph.adj_list[j])&lt;br /&gt;
                total_cost += min(dist[j], r[j], min_edge_cost)&lt;br /&gt;
        total_costs.append(total_cost)&lt;br /&gt;
&lt;br /&gt;
    # Scriere rezultate&lt;br /&gt;
    with open(&amp;quot;regate.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for cost in total_costs:&lt;br /&gt;
            fout.write(str(cost) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
</feed>