fbpx

Problema #583 – Tare – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă un graf orientat cu n noduri. Să se determine câte componente tare conexe are graful dat.

Date de intrare

Programul citește de la tastatură numărul n de noduri și numărul m de arce, iar apoi lista arcelor, formată din m perechi de forma i j, cu semnificația că există arc orientat de la nodul i la nodul j.

Date de ieșire

Programul va afișa pe ecran numărul C de componente tare conexe.

Restricții și precizări

  • 1 ≤ n ≤ 100

Exemplu

Intrare

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

Ieșire

2

Explicație

Cele două componente tare conexe sunt: 1 2 4 și 3 5

#include <bits/stdc++.h>

using namespace std;

vector <int> G[100002];
vector <int> H[100002];
int n , m , x , y , S[100001] , D[100001] , c;

void dfs_succ(int v , int c)
{
    S[v] = c;
    for(int i : G[v])
        if(!S[i]) dfs_succ(i , c);
}

void dfs_pred(int v , int c)
{
    D[v] = c;
    for(int i : H[v])
        if(!D[i]) dfs_pred(i , c);
}

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x >> y;
        G[x].push_back(y);
        H[y].push_back(x);
    }

    for(int i = 1 ; i <= n ; i++)
        if(!S[i])
        {
            c++;
            dfs_succ(i , c);
            dfs_pred(i , c);
            for(int i = 1 ; i <= n ; i++)
                if(S[i] != D[i]) S[i] = D[i] = 0;
        }

    cout << c;

}
Comentarii

S-ar putea sa iti placa