336
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