Объясните как реализовывать и пользоваться cписками смежности.
Объясните как реализовывать и пользоваться cписками смежности.
| № | Пользователь | Рейтинг |
|---|---|---|
| 1 | Benq | 3676 |
| 2 | Kevin114514 | 3657 |
| 3 | jiangly | 3638 |
| 4 | turmax | 3442 |
| 5 | tourist | 3380 |
| 6 | Um_nik | 3353 |
| 7 | strapple | 3350 |
| 8 | squareOf105 | 3346 |
| 9 | heuristica | 3322 |
| 10 | maroonrk | 3310 |
| Страны | Города | Организации | Всё → |
| № | Пользователь | Вклад |
|---|---|---|
| 1 | Qingyu | 158 |
| 2 | nik_exists | 151 |
| 3 | maspy | 150 |
| 4 | AmShZ | 143 |
| 4 | Um_nik | 143 |
| 6 | Errichto | 139 |
| 7 | adamant | 137 |
| 8 | BledDest | 134 |
| 9 | maroonrk | 133 |
| 10 | qwexd | 130 |
| Название |
|---|



В списках смежности используется 3 массива ls, r, prev.
В ls[v] хранится номер последнего ребра с которым связана вершина v, r[i] будет хранить номер вершины на которую ведет ребро i, prev[i] хранит номер ребра с которым вершина v была связана до ребра i.
Реализация:
m — кол-во ребер.
Если честно, то я так и не понял в чем суть. Список смежности — это структурка, где для каждой вершины храним в динамическом списке смежные вершины. В C++ делается через std::vector.
UPD:
Легче всего, мне кажется, так делается (на с++):
Получается, что graph[v] будет хранить список вершин связанных с вершиной v. Вот код:
И вот собственно dfs():
Мне кажется, или graph[v] будет хранить вектор векторов, а не список смежных вершин?
graph[][] сам по себе вектор векторов, а graph[v] -- это вектор (список вершин)
Я имею ввиду, что если объявлять:
То graph будет массивом, где в одной ячейке вектор векторов. graph получается трехмерным.
Да, это неверно. Нужно просто
или же
Да, точно! Просто я перепутал: вместо круглых скобок, написал квадратные)
моё http://codeforces.me/blog/entry/5195 подробное объяснение на эту тему, если есть вопросы — задавай!