Pagini recente » Cod sursa (job #2559679) | Cod sursa (job #2622203) | Cod sursa (job #2539332) | Istoria paginii runda/mall | Cod sursa (job #2822363)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
ifstream f("bfs.in");
ofstream g("bfs.out");
class graf
{
int n, m;
vector <int> muchii[100001];
public:
graf(int n, int m);
void citire_orientat();
void bfs(int s);
};
graf :: graf(int n, int m)
{
this->n=n;
this->m = m;
}
void graf::citire_orientat()
{
int nod1, nod2;
for (int i = 0; i <= m; i++)
{
f >> nod1 >> nod2;
muchii[nod1].push_back(nod2);
}
}
void graf :: bfs(int s)
{
queue <int> q;
bool vizitat[100001];
int distanta[100001];
vizitat[s] = 1;
q.push(s); //adaugam in coada s-ul de start si il marcam ca vizitat si distanta 0
distanta[s]=0;
while(!q.empty())//daca avem elemente in coada, executam:
{
int curent = q.front(); //nodul curent devine cel mai vechi nod adaugat in coada
q.pop();
//parcurgem lista de adicaneta pt a gasi varfurile adiacente nevizitate ale noduliui curent
for(auto i : muchii[curent])
if(!vizitat[i])
{
vizitat[i] = 1;
q.push(i);
distanta[i] = distanta[curent] + 1;
}
}
for(int i = 1; i <= n; ++i)
if(vizitat[i])
g << distanta[i] << " ";
else
g << -1 << " ";
}
int main()
{
int n, m, s;
f >> n >> m >> s;
graf G(n, m);
G.citire_orientat();
G.bfs(s);
return 0;
}