fbpx

Problema #581 – Drumuri – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă un graf orientat cu n noduri și un nod p. Să se afișeze toate nodurile q ale grafului, diferite de p, cu proprietatea că există cel puțin un drum de la p la q și lungimea drumului minim este pară.

Date de intrare

Programul citește de la tastatură numărul n de noduri, nodul p ș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 noduri care respectă cerința, iar pe rândul următor cele C noduri, în ordine crescătoare, separate prin exact un spațiu.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • prin drum minim se înțelege drum de cu lungimea minimă

Exemplu

Intrare

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

Ieșire

3
1 4 6
#include <bits/stdc++.h>


using namespace std;

vector <int> G[101];

int n , a[101][101] , ok , x , y , p , m , v[101] , d[101] , cnt , rez[101];

void bfs(int s)
{
    queue <int> Q;
    v[s] = 1;
    d[s] = 1;
    Q.push(s);
    while(!Q.empty())
    {
        int x = Q.front();
        for(int i : G[x])
            if(!v[i])
            {
                Q.push(i);
                v[i] = 1;
                d[i] = d[x] + 1;
            }
        Q.pop();
    }
}

int main()
{
    cin >> n >> p >> m;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x >> y;
        G[x].push_back(y);
    }
    bfs(p);
    for(int i = 1 ; i <= n ; i++)
        if((d[i] - 1) % 2 == 0 && i != p) cnt++ , rez[cnt] = i;

    cout << cnt << '\n';
    for(int i = 1 ; i <= cnt ; i++)
        cout << rez[i] << " ";
}
Comentarii

S-ar putea sa iti placa