You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#include<bits/stdc++.h>/* этот хедер доступен только под gcc и по сути является просто инклудом с кучей других часто используемых инклудов */
2
-
usingnamespacestd;
3
-
4
-
intmain(){
5
-
6
-
/* обозначения:
7
-
n - число вершин,
8
-
m - число рёбер,
9
-
g[][] - граф,
10
-
s - начало пути,
11
-
t - конец пути,
12
-
q - очередь на обработку вершин,
13
-
d[] - расстояния от s (-1, если вершина недостижима из s)
14
-
*/
15
-
16
-
int n, m;
17
-
cin >> n >> m;
18
-
19
-
/* храним граф в виде "вектора векторов", т. е. g[v] содержит вектор-список всех соседней v */
20
-
/* выбор такой структуры обусловлен тем, что вектор легко автоматически масштабируется */
21
-
vector< vector<int> > g(n);
22
-
23
-
while(m--){ /* цикл исполнится ровно m раз, я гарантирую это */
24
-
int u, v;
25
-
cin >> u >> v;
26
-
g[u].push_back(v);
27
-
g[v].push_back(u);
28
-
}
29
-
30
-
int s, t;
31
-
cin >> s >> t;
32
-
33
-
vector<int> d(n, -1); /* изначально будем считать недостижимыми все вершины, кроме s */
1
+
vector<int> bfs(int s){
2
+
vector<int> d(n, -1);
34
3
d[s] = 0;
35
-
36
4
queue<int> q;
37
5
q.push(s);
38
-
39
-
while(!q.empty()){
40
-
int v = q.front(); /* записываем id первой вершины в очереди */
41
-
q.pop(); /* ...и сразу же её оттуда удаляем */
42
-
for(int u : g[v]) /* уникальная фишка C++11, означает "перебрать все элементы g[v], копируя их при каждой итерации в u; просто перебираем всех соседей v */
43
-
if(d[u] == -1) /* следует читать как "если вершина u не была посещена ранее" */
44
-
d[u] = d[v] + 1, q.push(v); /* устанавливаем расстояние и пихаем u в конец очереди */
0 commit comments