fbpx

Problema #538 – LungimeMinima – Rezolvari PBInfo

de Mihai-Alexandru

Cerinţa

Se dă lista muchiilor unui graf neorientat cu n vârfuri și vârf p . Să se determine toate nodurile q ale grafului cu proprietatea că lungimea minimă a unui lanț de la q la p este L.

Date de intrare

Fişierul de intrare lungimeminima.in conţine pe prima linie numerele n p L, cu semnificația precizată. Fiecare dintre următoarele linii conține câte o pereche de numere i j, cu semnificația că există muchie între i și j.

Date de ieşire

Fişierul de ieşire lungimeminima.out va conţine pe prima linie numărul de vârfuri determinate. A doua linie va conține în ordine crescătoare vârfurile determinate, separate prin exact un spațiu.

Restricţii şi precizări

  • 1 ≤ n ≤ 100
  • 1 ≤ i , j ≤ n
  • în fișierul de intrare muchiile se pot repeta;
  • pentru toate datele de test există cel puțin un vârf q cu proprietatea dorită;

Exemplu

lungimeminima.in

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

lungimeminima.out

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

using namespace std;

ifstream cin("lungimeminima.in");
ofstream cout("lungimeminima.out");

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

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

}

int main()
{
    cin >> n >> p >> L;

    while(cin >> x >> y)
    {
        a[x][y] = a[y][x] = 1;
    }

    bfs(p);

    for(int i = 1 ; i <= n ; i++)
        if(d[i] == L + 1) cnt++;

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

S-ar putea sa iti placa