我将在评论中留下问题和我对算法的理解。代码取自著名的算法站点。`
vector < vector<int> > g; // граф, почему вектор, а не массив ?
int n; // число вершин
int s; // стартовая вершина (вершины везде нумеруются с нуля)
// чтение графа
queue<int> q; // очередь для помещения туда узлов
q.push (s); // вставляю стартовую вершину в очередь
vector<bool> used (n); // булевый вектор для узлов, по которым прошёл ?
vector<int> d (n), p (n); // для чего еще два вектора ?
used[s] = true; // помещаю в вектор элемент с пометкой посещенная
p[s] = -1; // ??? для чего это ???
while (!q.empty()) { // выполнять цикл пока очередь не пуста
int v = q.front(); // присвоить первый элем. очереди
q.pop(); // удалить первый элемент из очереди
for (size_t i=0; i<g[v].size(); ++i) { // цикл выполняется пока итератор меньше чем граф
int to = g[v][i]; // что мы здесь извлекаем из графа ? там же нет значения
if (!used[to]) { // если to еще непосещенная, то ...
used[to] = true; // ... отметить посещенной ...
q.push (to); // ... вставить её в стек
d[to] = d[v] + 1; // ???
p[to] = v; // ???
}
}
}`
这是广度优先扫描 ( BFS )。“逐行”的概念不适用于图形。
使用向量是因为它很方便;)(邻接列表有不同的长度)
p[]-前辈(前辈) -p[i]在此绕过期间写入他们从哪个顶点到达第i个顶点d[]- 距起始顶点的距离for (size_t i=0; i<g[v].size(); ++i) { // цикл выполняется пока итератор меньше чем граф与给定顶点相邻的顶点在此处被绕过
int to = g[v][i]; // что мы здесь извлекаем из графа ? там же нет значения第 v 个顶点的邻接列表中第 i 个顶点的索引