343
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 ≤ 1001 ≤ i , j ≤ n- în fișierul de intrare muchiile se pot repeta;
- pentru toate datele de test există cel puțin un vârf
qcu 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