# PBinfo #2232 – retea1 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Pentru a testa o nouă topologie s-a construit o reţea de calculatoare în care fiecare calculator transmite informaţia unidirecţional către un singur calculator din reţea. Numim conexiune o pereche ordonată de calculatoare, nu neapărat distincte, în care primul este cel care trimite informaţia iar al doilea este cel care o recepţioneaza direct. Fiind dată o astfel de reţea şi conexiunile existente între calculatoarele care o alcătuiesc, să se determine submulţimea cu număr maxim de calculatoare-feed-back. Un calculator-feed-back are proprietatea că informația ce pleacă de la acesta ajunge, prin intermediul conexiunilor succesive, înapoi la calculatorul de la care a plecat.

Cerința
Scrieţi un program care, pentru o reţea cu n calculatoare numerotate de la 1 la n şi conexiuni precizate, determină submulţimea cu număr maxim de calculatoare-feed-back.

Date de intrare
Pe prima linie a fişierului de intrare retea1.in se află un număr natural nenul n, reprezentând numărul de calculatoare din reţea, iar pe fiecare dinre următoarele n linii, separate prin câte un spaţiu, câte n-1 valori 0 şi o valoare 1, cu semnificaţia: pe linia i, elementul de pe poziţia j este 1 dacă şi numai dacă există conexine între calculatorul i şi calculatorul j.

Date de ieșire
În fişierul de ieşire retea1.out se vor scrie pe prima linie calculatoarele-feed-back din submulţimea determinată. Elementele submulţimii sunt scrise în ordine crescătoare, separate prin câte o virgulă, fără spaţii iar submulţimea începe cu caracterul { şi se termină cu caracterul }. În fişierul de ieşire nu se vor scrie spaţii înainte, între sau după elementele mulţimii.

Restricții și precizări

1 ≤ n ≤ 300
un calculator poate să aibă o conexiune cu el însuşi
un calculator poate avea o conexiune doar cu singur calculator

Exemplul 1:
retea1.in

5
0 0 0 1 0 
1 0 0 0 0 
1 0 0 0 0 
0 1 0 0 0 
0 0 0 0 1
retea1.out

{1,2,4,5}
Explicație
Calculatorul 1 are conexiune cu calculatorul 4, calculatorul 4 are conexiune cu calculatorul 2, iar calculatorul 2 are conexiune cu calculatorul 1, deci oricare dintre calculatoarele 1, 2 sau 4 este calculator-feed-back. Calculatorul 5 are conexiune cu el însuşi deci este calculator-feed-back. Submulţimea finală este {1,2,4,5}.

Exemplul 2:
retea1.in

6
0 0 0 0 1 0 
0 0 0 1 0 0 
0 0 0 0 0 1 
0 0 0 0 1 0 
0 0 0 1 0 0 
0 0 0 1 0 0
retea1.out

{4,5}

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
ifstream f("retea1.in");
ofstream g("retea1.out");
int A[15001], n;
char c[15001], V[15001];
int main()
{
    int x, i, j;
    f >> n;
    f.get();
    for(i = 1; i <= n; i++)
    {
        V[i] = 0;
        f.get(c, 15001);
        f.get();
        for(j = 0; j < n; j++)
        if(c[2 * j] == '1') A[i] = j + 1;
    }
    for(i = 1; i <= n; i++)
        if(V[i] == 0)
        {
            x = i;
            for(j = 1; j <= n; j++)
                if(V[j] == 1) V[j] = 0;
            while(V[x] != 2)
            {
              V[x]++;
              x = A[x];
            }
        }
    for(i = 1, x = 0; i <= n; i++)
        if(V[i] == 2) x++;
    g << "{";
    for(i = 1; i <= n; i++)
        if (V[i] == 2)
        {
            if (--x > 0) g << i << ",";
            else g << i;
        }
    g << '}';
    g.close();
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2232)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2232/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2232/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
