fbpx

Problema #2888 – Spanning – Rezolvari PBInfo

de Mihai-Alexandru

Se consideră un graf neorientat conex cu n noduri și n muchii.

Cerința

Să se determine numărul arborilor parțiali ai grafului.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n perechi de numere naturale x y reprezentând cele n muchii.

Date de ieșire

Programul va afișa pe ecran numărul arborilor parțiali ai grafului.

Restricții și precizări

  • 1 ≤ n ≤ 30.000
  • cele n muchii sunt distincte două câte două

Exemplu

Intrare

7
1 4
1 5
2 3
2 4
4 5
4 6
4 7

Ieșire

3

Explicație

Graful din exemplu corespunde imaginii de mai jos.

Primul arbore parțial este format din muchiile: (1, 4), (2, 3), (2, 4), (4, 5), (4, 6), (4, 7).
Al doilea arbore parțial este format din muchiile: (1, 4), (1, 5), (2, 3), (2, 4), (4, 6), (4, 7).
Al treilea arbore parțial este format din muchiile: (1, 5), (2, 3), (2, 4), (4, 5), (4, 6), (4, 7).

#include <bits/stdc++.h>


using namespace std;

int n , x , y , p[50001] , cnt;
vector <int> G[50001];
queue <int> Q;
int main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
        p[x]++;
        p[y]++;
    }

    for(int i = 1 ; i <= n ; i++)
        if(p[i] == 1)Q.push(i);

    while(!Q.empty())
    {
        x = Q.front();
        for(int y : G[x])
            if(p[y])
            {
                p[y]--;
                if(p[y] == 1) Q.push(y);
            }
        p[x] = 0;
        Q.pop();
    }
    for(int i = 1 ; i <= n ; i++)
        if(p[i] == 2) cnt++;
    cout <<cnt;
}
Comentarii

S-ar putea sa iti placa