Documente Academic
Documente Profesional
Documente Cultură
BFS - Parcurgerea in Latime
BFS - Parcurgerea in Latime
0
Share
în adâncime (DFS = Depth First Search)
în lătime (BFS = Breadth First Search)
Memorarea vecinilor
Vom folosii libraria #include <vector> pentru a utiliza vectori alocati dinamic.
Explicatia o gasiti in articol.
1 #include <vector>
2 const int NLIM = 100005;
3 vector < int > Edge[NLIM];
1 Edge[x].push_back(y);
Folosirea cozii
Deoarece algoritmul BFS parcurge mai intai toate nodurile de acelasi nivel (adica „toti
vecinii deodata”), avem nevoie sa folosim o coada pentru a retine nodurile ce urmeaza a
fi parcurse.
1 #include <queue>
2 queue <int> Coada;
3 Coada.push(NodStart);
Algoritmul BFS
Declaram vectorul global „Distanta” in care Distanta[i] va reprezenta distanta de la
nodul de start la nodul numarul i.
1 void BFS()
2 {
3 int Nod, Vecin;
4 while(!Coada.empty())
5 {
6 Nod = Coada.front();
7 Coada.pop();
8 for(unsigned int i = 0; i < Edge[Nod].size(); i++)
9 {
10 Vecin = Edge[Nod][i];
11 if(Distanta[Vecin] == -1)
12 {
13 Coada.push(Vecin);
14 Distanta[Vecin] = Distanta[Nod] + 1;
15 }
16 }
17 }
18 }
Primul lucru in algloritmul BFS va fi intotdeauna sa luam primul nod din coada si sa-l
analizam. Functia front() preia primul element din coada, in timp ce functia pop il
sterge din coada. Mai multe detalii despre clasa <queue>, gasiti aici: Coada C++.
Dupa ce am preluat nodul curent din coada, ii punem toti vecinii in coada si le calculam
distanta.
La final dupa ce am parcurs toate nodurile, afisam distanta pentru fiecare nod in parte.
1 for(int i = 1; i <= N; i++)
2 fout << Distance[i] << " ";
Tot algoritmul pentru obtinerea celor 100 de puncte pe infoarena.ro poate fi gasit mai
jos:
1 #include <iostream>
2 #include <fstream>
3 #include <vector>
4 #include <queue>
5
6 using namespace std;
7
8 ifstream fin("bfs.in");
9 ofstream fout("bfs.out");
10
11 const int NLIM = 100005;
12
13 int N, M, S;
14 int Distance[NLIM];
15
16 vector <int> Edge[NLIM];
17 queue <int> Q;
18
19 void BFS()
20 {
21 int Node, Next;
22 while(!Q.empty())
23 {
24 Node = Q.front();
25 Q.pop();
26 for(unsigned int i = 0; i < Edge[Node].size(); i++)
27 {
28 Next = Edge[Node][i];
29 if(Distance[Next] == -1)
30 {
31 Q.push(Next);
32 Distance[Next] = Distance[Node] + 1;
33 }
34 }
35 }
36 }
37
38 void Read()
39 {
40 fin >> N >> M >> S;
41 for(int i = 1; i <= M; i++)
42 {
43 int x, y;
44 fin >> x >> y;
45 Edge[x].push_back(y);
46 }
47 for(int i = 1; i <= N; i++)
48 Distance[i] = -1;
49 Distance[S] = 0;
50
51 Q.push(S);
52
53 BFS();
54
55 for(int i = 1; i <= N; i++)
56 fout << Distance[i] << " ";
57 }
58
59 int main()
60 {
61 Read();
62 return 0;
63 }