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";
}