<?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=3547_-_vacanta2020</id>
	<title>3547 - vacanta2020 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3547_-_vacanta2020"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3547_-_vacanta2020&amp;action=history"/>
	<updated>2026-05-01T06:38:54Z</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=3547_-_vacanta2020&amp;diff=10079&amp;oldid=prev</id>
		<title>Danciu: Pagină nouă:  = Cerința = În anul 2020, profitând de lipsa oamenilor de pe şosele, guvernul a construit atâtea şosele încât poţi ajunge din orice oraş al patriei în oricare altul. Drumul dintre două oraşe are şi un cost, cel al benzinei consumate. Dorel s-a hotărât să plece într-o excursie, pornind din oraşul &lt;code&gt;1&lt;/code&gt; până într-un oraş oarecare. El profită şi de oferta guvernului de relansare a turismului, având &lt;code&gt;k&lt;/code&gt; vouchere de călătorie. Un vo...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3547_-_vacanta2020&amp;diff=10079&amp;oldid=prev"/>
		<updated>2024-06-04T01:57:10Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă:  = Cerința = În anul 2020, profitând de lipsa oamenilor de pe şosele, guvernul a construit atâtea şosele încât poţi ajunge din orice oraş al patriei în oricare altul. Drumul dintre două oraşe are şi un cost, cel al benzinei consumate. Dorel s-a hotărât să plece într-o excursie, pornind din oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; până într-un oraş oarecare. El profită şi de oferta guvernului de relansare a turismului, având &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; vouchere de călătorie. Un vo...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
În anul 2020, profitând de lipsa oamenilor de pe şosele, guvernul a construit atâtea şosele încât poţi ajunge din orice oraş al patriei în oricare altul. Drumul dintre două oraşe are şi un cost, cel al benzinei consumate. Dorel s-a hotărât să plece într-o excursie, pornind din oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; până într-un oraş oarecare. El profită şi de oferta guvernului de relansare a turismului, având &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; vouchere de călătorie. Un voucher îl scuteşte de plata benzinei între două oraşe consecutiv vizitate, traseu pe care îl alege el pentru scutirea plăţii, de asemenea nefiind obligatorie folosirea tuturor voucherelor primite. Aflaţi costul minim al călătoriei din oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pâna la fiecare oraş.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;vacanta2020.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de oraşe, numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; de drumuri între aceste oraşe şi numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; de vouchere, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii câte 3 numere &amp;lt;code&amp;gt;u v c&amp;lt;/code&amp;gt; semnificând faptul că între oraşele &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; există un drum iar costul benzinei pentru parcurgerea lui este &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;vacanta2020.out&amp;lt;/code&amp;gt; va conține pe prima linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, reprezentând costurile deplasării de la oraşul 1 la fiecare din cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; oraşe.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 35.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 400.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ u ≠ v ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ c ≤ 30.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;vacanta2020.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 11 1&lt;br /&gt;
 1 2 7&lt;br /&gt;
 1 3 2&lt;br /&gt;
 2 3 3&lt;br /&gt;
 2 4 1&lt;br /&gt;
 3 4 6&lt;br /&gt;
 3 5 10&lt;br /&gt;
 4 5 4&lt;br /&gt;
 4 6 20&lt;br /&gt;
 5 6 2&lt;br /&gt;
 5 7 11&lt;br /&gt;
 6 7 3&lt;br /&gt;
&amp;lt;code&amp;gt;vacanta2020.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 0 0 1 2 4 7&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Un traseu de cost minim de la oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1-3-5-6-7&amp;lt;/code&amp;gt;, costul acestuia fiind &amp;lt;code&amp;gt;2+10+2+3=17&amp;lt;/code&amp;gt;, însă având un voucher se poate elimina costul drumului &amp;lt;code&amp;gt;3-5&amp;lt;/code&amp;gt;, care are valoarea &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, costul final fiind &amp;lt;code&amp;gt;17-10=7&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;
inf = float(&amp;#039;inf&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor din fișierul de intrare&lt;br /&gt;
with open(&amp;quot;vacanta2020.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n, m, k = map(int, f.readline().split())&lt;br /&gt;
    G = [[] for _ in range(n + 1)]&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        x, y, c = map(int, f.readline().split())&lt;br /&gt;
        G[x].append((y, c))&lt;br /&gt;
        G[y].append((x, c))&lt;br /&gt;
&lt;br /&gt;
# Initializarea distanțelor&lt;br /&gt;
d = [[inf] * (k + 1) for _ in range(n + 1)]&lt;br /&gt;
d[1][0] = 0&lt;br /&gt;
&lt;br /&gt;
# Folosirea unui heap pentru a implementa algoritmul lui Dijkstra&lt;br /&gt;
pq = [(0, 1, 0)]&lt;br /&gt;
while pq:&lt;br /&gt;
    dist, nod, nr_tickete = heapq.heappop(pq)&lt;br /&gt;
    if d[nod][nr_tickete] &amp;lt; dist:&lt;br /&gt;
        continue&lt;br /&gt;
    for nod1, cost in G[nod]:&lt;br /&gt;
        # Fără a folosi un bilet&lt;br /&gt;
        if d[nod1][nr_tickete] &amp;gt; d[nod][nr_tickete] + cost:&lt;br /&gt;
            d[nod1][nr_tickete] = d[nod][nr_tickete] + cost&lt;br /&gt;
            heapq.heappush(pq, (d[nod1][nr_tickete], nod1, nr_tickete))&lt;br /&gt;
        # Folosind un bilet&lt;br /&gt;
        if nr_tickete &amp;lt; k:&lt;br /&gt;
            if d[nod1][nr_tickete + 1] &amp;gt; d[nod][nr_tickete]:&lt;br /&gt;
                d[nod1][nr_tickete + 1] = d[nod][nr_tickete]&lt;br /&gt;
                heapq.heappush(pq, (d[nod1][nr_tickete + 1], nod1, nr_tickete + 1))&lt;br /&gt;
&lt;br /&gt;
# Scrierea rezultatelor în fișierul de ieșire&lt;br /&gt;
with open(&amp;quot;vacanta2020.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        mini = min(d[i])&lt;br /&gt;
        fout.write(str(mini) + &amp;#039; &amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
</feed>