fbpx

Problema #1707 – Retea – Rezolvari PBInfo

de Mihai-Alexandru

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 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

  • 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 << " ";
        }
    }
}
Comentarii

S-ar putea sa iti placa