<?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=2165_-_Graf_1</id>
	<title>2165 - Graf 1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2165_-_Graf_1"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2165_-_Graf_1&amp;action=history"/>
	<updated>2026-05-02T20:25:14Z</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=2165_-_Graf_1&amp;diff=9145&amp;oldid=prev</id>
		<title>Rus Marius: Pagină nouă: == Enunț == Se știe că într-un graf neorientat conex, între oricare două vârfuri există cel putin un lanț iar lungimea unui lanț este egală cu numărul muchiilor care-l compun. Definim noțiunea lanț optim între două vârfuri &lt;code&gt;X&lt;/code&gt; și &lt;code&gt;Y&lt;/code&gt; ca fiind un lanț de lungime minimă care are ca extremități vârfurile &lt;code&gt;X&lt;/code&gt; și &lt;code&gt;Y&lt;/code&gt;. Este evident că între oricare două vârfuri ale unui graf conex vom avea unul sau mai multe la...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2165_-_Graf_1&amp;diff=9145&amp;oldid=prev"/>
		<updated>2024-01-06T21:39:45Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Enunț == Se știe că într-un graf neorientat conex, între oricare două vârfuri există cel putin un lanț iar lungimea unui lanț este egală cu numărul muchiilor care-l compun. Definim noțiunea lanț optim între două vârfuri &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; ca fiind un lanț de lungime minimă care are ca extremități vârfurile &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Este evident că între oricare două vârfuri ale unui graf conex vom avea unul sau mai multe la...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Enunț ==&lt;br /&gt;
Se știe că într-un graf neorientat conex, între oricare două vârfuri există cel putin un lanț iar lungimea unui lanț este egală cu numărul muchiilor care-l compun. Definim noțiunea lanț optim între două vârfuri &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; ca fiind un lanț de lungime minimă care are ca extremități vârfurile &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Este evident că între oricare două vârfuri ale unui graf conex vom avea unul sau mai multe lanțuri optime, depinzând de configurația grafului.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind dat un graf neorientat conex cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; vârfuri etichetate cu numerele de ordine &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și două vârfuri ale sale notate &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ X, Y ≤ N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X≠Y&amp;lt;/code&amp;gt; ), se cere să scrieți un program care determină vârfurile care aparțin tuturor lanțurilor optime dintre &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&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;graf1.in&amp;lt;/code&amp;gt; conține pe prima linie patru numere naturale reprezentând: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (numărul de vârfuri ale grafului), &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; (numărul de muchii), &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; (cu semnificația din enunț). Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii câte două numere naturale nenule &amp;lt;code&amp;gt;A[i], B[i]&amp;lt;/code&amp;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;, pentru &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt; ) fiecare dintre aceste perechi de numere reprezentând câte o muchie din graf.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;graf1.out&amp;lt;/code&amp;gt; va conține pe prima linie, numărul de vârfuri comune tuturor lanțurilor optime dintre &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;; pe a doua linie, numerele corespunzătoare etichetelor acestor vârfuri, dispuse în ordine crescătoare; între două numere consecutive de pe această linie se va afla câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N ≤ 7500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 14000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 1 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 6&lt;br /&gt;
 2 5&lt;br /&gt;
 3 5&lt;br /&gt;
 5 6&lt;br /&gt;
 5 4&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 4 5&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7501 7 1 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 6&lt;br /&gt;
 2 5&lt;br /&gt;
 3 5&lt;br /&gt;
 5 6&lt;br /&gt;
 5 4&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.out&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;
&lt;br /&gt;
def check_constraints(n, m):&lt;br /&gt;
    return 2 &amp;lt;= n &amp;lt;= 7500 and 1 &amp;lt;= m &amp;lt;= 14000&lt;br /&gt;
&lt;br /&gt;
def bfs(start, dist, E):&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        dist[i] = float(&amp;#039;inf&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    q = deque([start])&lt;br /&gt;
    dist[start] = 0&lt;br /&gt;
    &lt;br /&gt;
    while q:&lt;br /&gt;
        nn = q.popleft()&lt;br /&gt;
        for i in E[nn]:&lt;br /&gt;
            if dist[i] == float(&amp;#039;inf&amp;#039;):&lt;br /&gt;
                dist[i] = dist[nn] + 1&lt;br /&gt;
                q.append(i)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;graf1IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, m, x, y = map(int, f.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        if not check_constraints(n, m):&lt;br /&gt;
            with open(&amp;quot;graf1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
        E = [[] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            a, b = map(int, f.readline().split())&lt;br /&gt;
            E[a].append(b)&lt;br /&gt;
            E[b].append(a)&lt;br /&gt;
&lt;br /&gt;
    dist1 = [0] * (n + 1)&lt;br /&gt;
    dist2 = [0] * (n + 1)&lt;br /&gt;
    fr = [0] * (n + 1)&lt;br /&gt;
    rez = []&lt;br /&gt;
&lt;br /&gt;
    bfs(x, dist1, E)&lt;br /&gt;
    bfs(y, dist2, E)&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if dist1[i] + dist2[i] == dist1[y]:&lt;br /&gt;
            fr[dist1[i]] += 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if dist1[i] != float(&amp;#039;inf&amp;#039;) and dist2[i] != float(&amp;#039;inf&amp;#039;) and dist1[y] != float(&amp;#039;inf&amp;#039;):&lt;br /&gt;
            if dist1[i] + dist2[i] == dist1[y] and fr[dist1[i]] == 1:&lt;br /&gt;
                rez.append(i)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;graf1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        if rez:&lt;br /&gt;
            g.write(str(len(rez)) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
            g.write(&amp;quot; &amp;quot;.join(map(str, rez)))&lt;br /&gt;
        else:&lt;br /&gt;
            g.write(&amp;quot;Nu exista noduri care sa corespunda conditiilor.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
</feed>