<?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=1825_-_Zoomba</id>
	<title>1825 - Zoomba - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1825_-_Zoomba"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1825_-_Zoomba&amp;action=history"/>
	<updated>2026-06-17T09:37:05Z</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=1825_-_Zoomba&amp;diff=9141&amp;oldid=prev</id>
		<title>Rus Marius: Pagină nouă: = Enunț = În țara Zoomba trăiesc &lt;code&gt;K&lt;/code&gt; prieteni, fiecare în localități diferite. În această țară se găsesc &lt;code&gt;N&lt;/code&gt; orașe, oricare două fiind legate prin cel mult o șosea bidirecțională. Deoarece nu s-au mai întâlnit de mult, cei &lt;code&gt;K&lt;/code&gt; prieteni s-au hotărât să se reîntâlnească într-un oraș. Fiecare are câte o mașină cu număr nelimitat de locuri. Pentru a trece de la un oraș la altul, o mașină consumă &lt;code&gt;1&lt;/code&gt; li...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1825_-_Zoomba&amp;diff=9141&amp;oldid=prev"/>
		<updated>2024-01-06T20:37:24Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: = Enunț = În țara Zoomba trăiesc &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni, fiecare în localități diferite. În această țară se găsesc &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe, oricare două fiind legate prin cel mult o șosea bidirecțională. Deoarece nu s-au mai întâlnit de mult, cei &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni s-au hotărât să se reîntâlnească într-un oraș. Fiecare are câte o mașină cu număr nelimitat de locuri. Pentru a trece de la un oraș la altul, o mașină consumă &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; li...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Enunț =&lt;br /&gt;
În țara Zoomba trăiesc &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni, fiecare în localități diferite. În această țară se găsesc &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe, oricare două fiind legate prin cel mult o șosea bidirecțională. Deoarece nu s-au mai întâlnit de mult, cei &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni s-au hotărât să se reîntâlnească într-un oraș. Fiecare are câte o mașină cu număr nelimitat de locuri. Pentru a trece de la un oraș la altul, o mașină consumă &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; litru de benzină.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Știind că odată ce au ajuns în același oraș &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; sau mai mulți prieteni, aceștia iși pot continua drumul cu o singură mașină, să se determine consumul minim de benzină pentru ca aceștia să ajungă în orașul &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;zoombaIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;(numărul de șosele), &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;. Pe următoarea linie se află &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere, reprezentând pozițiile inițiale ale celor &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află câte o pereche &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există șosea de la orașul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la orașul &amp;lt;code&amp;gt;j&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;zoombaOUt.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, ce va fi egal cu consumul minim de combustibil necesar ca cei &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni să se întâlnească în orașul &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;, sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; în cazul în care aceștia nu pot ajunge în el.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Z ≤ N ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K ≤ min(N,10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 4 3 5&lt;br /&gt;
 1 2 3&lt;br /&gt;
 1 4&lt;br /&gt;
 2 4&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 201 4 3 5&lt;br /&gt;
 1 2 3&lt;br /&gt;
 1 4&lt;br /&gt;
 2 4&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, k, z):&lt;br /&gt;
    if not (1 &amp;lt;= z &amp;lt;= n &amp;lt;= 200 and 1 &amp;lt;= k &amp;lt;= min(n, 10)):&lt;br /&gt;
        with open(&amp;#039;zoombaOUT.txt&amp;#039;, &amp;#039;w&amp;#039;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        sys.exit()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    kmax = 10&lt;br /&gt;
    nmax = 203&lt;br /&gt;
    inf = int(1e9)&lt;br /&gt;
&lt;br /&gt;
    def lee(v):&lt;br /&gt;
        while coada:&lt;br /&gt;
            k = coada.popleft()&lt;br /&gt;
            for i in range(len(g[k])):&lt;br /&gt;
                if dp[g[k][i]][v] &amp;gt; dp[k][v] + 1:&lt;br /&gt;
                    dp[g[k][i]][v] = dp[k][v] + 1&lt;br /&gt;
                    coada.append(g[k][i])&lt;br /&gt;
&lt;br /&gt;
    def construct(l):&lt;br /&gt;
        ret = 0&lt;br /&gt;
        i = 0&lt;br /&gt;
        while l:&lt;br /&gt;
            ret ^= (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
            i += 1&lt;br /&gt;
            l -= 1&lt;br /&gt;
        return ret&lt;br /&gt;
&lt;br /&gt;
    def nbiti(x):&lt;br /&gt;
        k = 0&lt;br /&gt;
        while x:&lt;br /&gt;
            k += (x &amp;amp; 1)&lt;br /&gt;
            x &amp;gt;&amp;gt;= 1&lt;br /&gt;
        return k&lt;br /&gt;
&lt;br /&gt;
    # Redirect input and output to files&lt;br /&gt;
    sys.stdin = open(&amp;#039;zoombaIN.txt&amp;#039;, &amp;#039;r&amp;#039;)&lt;br /&gt;
    sys.stdout = open(&amp;#039;zoombaOUT.txt&amp;#039;, &amp;#039;w&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    n, m, k, z = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    # Check constraints and exit if not met&lt;br /&gt;
    check_constraints(n, k, z)&lt;br /&gt;
&lt;br /&gt;
    a = list(map(int, input().split()))&lt;br /&gt;
    g = [[] for _ in range(nmax)]&lt;br /&gt;
    dp = [[inf] * (1 &amp;lt;&amp;lt; (kmax + 1)) for _ in range(nmax)]&lt;br /&gt;
    coada = deque()&lt;br /&gt;
&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        i, j = map(int, input().split())&lt;br /&gt;
        g[i].append(j)&lt;br /&gt;
        g[j].append(i)&lt;br /&gt;
&lt;br /&gt;
    for i in range(k):&lt;br /&gt;
        dp[a[i]][1 &amp;lt;&amp;lt; i] = 0&lt;br /&gt;
        coada.append(a[i])&lt;br /&gt;
        lee(1 &amp;lt;&amp;lt; i)&lt;br /&gt;
&lt;br /&gt;
    for l in range(2, k + 1):&lt;br /&gt;
        for j in range(construct(l), (1 &amp;lt;&amp;lt; k)):&lt;br /&gt;
            if nbiti(j) == l:&lt;br /&gt;
                for i in range(1, n + 1):&lt;br /&gt;
                    for c in range(1, j):&lt;br /&gt;
                        if (j | c) == j:&lt;br /&gt;
                            dp[i][j] = min(dp[i][j], dp[i][c] + dp[i][j ^ c])&lt;br /&gt;
                    coada.append(i)&lt;br /&gt;
                lee(j)&lt;br /&gt;
&lt;br /&gt;
    result = dp[z][(1 &amp;lt;&amp;lt; k) - 1] if dp[z][(1 &amp;lt;&amp;lt; k) - 1] != inf else -1&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
    # Close the files&lt;br /&gt;
    sys.stdin.close()&lt;br /&gt;
    sys.stdout.close()&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>Rus Marius</name></author>
	</entry>
</feed>