Cerința
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
Fișierul de intrare retea.in
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
Fișierul de ieșire retea.out
va conține pe prima linie n
numere naturale 0
sau 1
:
- al
i
-lea număr va fi0
dacă prin eliminarea serverului cu număruli
rămân legături între oricare două servere rămase - al
i
-lea număr va fi1
dacă prin eliminarea sa se pierde legătura între cel puțin două servere rămase.
Restricții și precizări
1 ≤ n ≤ 100
1 ≤ x,y ≤ n
Exemplu
retea.in
5 5 1 2 2 3 1 3 3 4 4 5
retea.out
0 0 1 1 0
Explicație
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.
#include <bits/stdc++.h> using namespace std; ifstream cin("retea.in"); ofstream cout("retea.out"); int n , x , y , C[101] , m; vector <int> G[101]; void dfs(int v , int x) { C[v] = 1; for(int i : G[v]) if(!C[i] && i != x) dfs(i , x); } int main() { cin >> n >> m; for(int i = 1 ; i <= m ; i++) { cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } for(int i = 1 ; i <= n ; i++) { if(i != 1) { for(int j = 1 ; j <= n ; j++) C[j] = 0; dfs(1 , i); int ok = 0; for(int j = 1 ; j <= n ; j++) if(C[j] == 0 && j != i) ok = 1; cout << ok << " "; } else { for(int j = 1 ; j <= n ; j++) C[j] = 0; dfs(2 , i); int ok = 0; for(int j = 1 ; j <= n ; j++) if(C[j] == 0 && j != i) ok = 1; cout << ok << " "; } } }