fbpx

Problema #3422 – dmink – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă un graf orientat cu n vârfuri și m arce prin lista arcelor și un număr natural k. Afișați vârfurile din graf care se află la distanță k față de vârful 1. Distanța dintre două vârfuri x și y este egală cu lungimea celui mai scurt drum care are ca extremitate inițială pe x și ca extremitate finală pe y.

Date de intrare

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

Date de ieșire

Programul va afișa pe ecran în ordine crescătoare și separate prin câte un spațiu vârfurile din graf care se află la distanță k față de vârful 1. Dacă nu există nici un vârf care să îndeplinească condiția, atunci se va afișa Nu exista.

Restricții și precizări

  • 1 ≤ k ≤ n ≤ 100

Exemplu

Intrare

8 12 2
1 3
3 5
5 7
7 1
2 6
6 8
8 2
1 4
4 6
4 8
4 2
1 8

Ieșire

2 5 6

Explicație

Drumurile de lungime minimă care au lungimea egală cu 2 și o extremitate în vârful 1 sunt:
[1, 4, 2]
[1, 8, 2]
[1, 3, 5]
[1, 4, 6]
[5, 7, 1]

#include <bits/stdc++.h>


using namespace std;

vector <int> G[101];
vector <int> H[101];

int n , m , x , y , k , c , cnt , d[101] , v[101] , ok , d2[101] , v2[101];

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

void bfs2(int nod)
{
    d2[nod] = 0;
    v2[nod] = 1;
    queue <int> q;
    q.push(nod);
    while(!q.empty())
    {
        int x = q.front();
        for(auto i : H[x])
            if(!v2[i])
            {
                d2[i] = d2[x] + 1;
                v2[i] = 1;
                q.push(i);
            }
        q.pop();
    }
}

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

    bfs1(1);
    bfs2(1);
    for(int i = 1 ; i <= n ; i++)
    {
        if(d[1] != 0 && d2[i] != 0)
        {
            if(min(d[i] , d2[i]) == k) cout << i << " " , ok++;
            ok++;
        }
        else if(d[i] != 0 && d[i] == k) cout << i << " " , ok++;
        else if(d2[i] != 0 && d2[i] == k) cout << i << " " , ok++;
    }
    if(ok == 0) cout << "Nu exista";
}
Comentarii

S-ar putea sa iti placa