1707 - Retea
Cerinţa[edit | edit source]
Se consideră o rețea formată din n servere, numerotate de la 1 la n. În rețea există m perechi de servere x y cunoscute între care există legături de comunicație directe. Între oricare două servere din rețea există legături, fie directe, fie prin intermediul altor servere.
Stabiliți pentru fiecare dintre cele n servere dacă eliminarea sa din rețea conduce la pierderea legăturii dintre cel puțin două servere rămase.
Date de intrare[edit | edit source]
Fișierul de intrare reteain.txt conține pe prima linie numerele n si m. Pe următoarele m linii se vor afla câte două numere naturale x y, reprezentând perechi de servere între care există legături directe.
Date de ieșire[edit | edit source]
Fișierul de ieșire reteaout.txt va conține pe prima linie n numere naturale 0 sau 1:
- al i-lea număr va fi 0 dacă prin eliminarea serverului cu numărul i rămân legături între oricare două servere rămase
- al i-lea număr va fi 1 dacă prin eliminarea sa se pierde legătura între cel puțin două servere rămase.
Restricţii şi precizări[edit | edit source]
- 1 ⩽ n ⩽ 100
- 1 ⩽ x,y ⩽ n
Exemplul 1[edit | edit source]
- reteain.txt
5 5 1 2 2 3 1 3 3 4 4 5
- reteaout.txt
Datele de intrare corespund restrictiilor impuse 0 0 1 1 0
Exemplul 2[edit | edit source]
- reteain.txt
101 1 1 2
- reteaout.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> from collections import defaultdict
def dfs(v, visited, graph):
visited[v] = True for u in graph[v]: if not visited[u]: dfs(u, visited, graph)
def main():
with open('reteain.txt', 'r') as fin: n, m = map(int, fin.readline().split()) edges = [list(map(int, fin.readline().split())) for _ in range(m)] if not (1 <= n <= 100) or not all(1 <= x <= n and 1 <= y <= n for x, y in edges): print("Datele de intrare nu corespund restrictiilor impuse") return print("Datele de intrare corespund restrictiilor impuse") graph = defaultdict(list) for x, y in edges: graph[x].append(y) graph[y].append(x) result = [] for i in range(1, n+1): visited = [False] * (n+1) visited[i] = True dfs((i % n) + 1, visited, graph) result.append('0' if all(visited[1:n+1]) else '1') with open('reteaout.txt', 'w') as fout: fout.write(' '.join(result))
if __name__ == "__main__":
main()
</syntaxhighlight>
Explicaţie[edit | edit source]
Serverul 1 daca este eliminat nu întrerupe legătura deoarece exista lanțul de legături 2 - 3 - 4 - 5 pe care nu îl afectează. Serverul 2 dacă este eliminat nu întrerupe legătura deoarece exista lanțul de legături 1 - 3 - 4 - 5 pe care nu îl afectează. Serverul 3 dacă este eliminat, serverele 1 și 2 nu mai pot comunica cu serverele 4 și 5. Serverul 4 daca este eliminat, serverele 1, 2 și 3 nu mai pot comunica cu serverul 5. Serverul 5 dacă este eliminat nu întrerupe legătura deoarece serverele 1, 2, 3, 4 sunt legate intre ele.