"Информатика (базовый и углублённый уровень)", Гейн А.Г., Сенокосов А.И.
Граф описывает объекты и связи между ними: вершины обозначают объекты, а рёбра — связи. Один и тот же граф можно изобразить рисунком или записать в виде таблицы либо списка. Матрицы и списки помогают хранить граф в программе и выполнять алгоритмы: например, искать путь или проверять, связаны ли две вершины. Выбор способа зависит от того, сколько в графе рёбер и какие действия нужно выполнять.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Граф — совокупность вершин и соединяющих их рёбер. На рисунке вершины обычно показывают точками или кружками, а рёбра — линиями между ними; у ориентированного ребра ставят стрелку. Такое изображение помогает увидеть связи, но для вычислений граф часто удобнее записать таблицей или списком.
Матрица смежности — квадратная таблица: и строки, и столбцы соответствуют вершинам, а ячейка показывает, соединена ли выбранная пара ребром. В простом невзвешенном графе обычно ставят 1 при наличии ребра и 0 при его отсутствии. Эта форма позволяет быстро проверить связь между двумя вершинами.
Матрица инцидентности — таблица, в которой строки соответствуют вершинам, а столбцы — рёбрам. Элемент показывает, связана ли данная вершина с данным ребром, например является ли она его концом. Такое представление удобно, когда нужно исследовать не только пары вершин, но и сами рёбра.
Список смежности — запись для каждой вершины перечня вершин, соединённых с ней рёбрами. В ориентированном графе обычно указывают вершины, в которые из данной вершины выходят дуги. Список позволяет сразу просмотреть доступные переходы.
Список рёбер — перечень пар вершин, соединённых рёбрами, при необходимости с указанием веса ребра. Например, запись (A, B, 5) может означать ребро между A и B с весом 5. Такой формат кратко хранит сами связи и их дополнительные характеристики.
Один и тот же граф можно сначала нарисовать, а затем закодировать таблицей или списком: вершины получают обозначения, а связи — записи между этими обозначениями. Рисунок удобен человеку для общего обзора, но программе важны однозначные данные, по которым можно выполнять операции. Поэтому способ выбирают с учётом задачи: нужно ли часто проверять одну связь, перебирать соседей или хранить только существующие рёбра.
Чтобы построить матрицу смежности, сначала задают единый порядок вершин, например A, B, C, и используют его и для строк, и для столбцов. Для каждого ребра отмечают ячейку на пересечении его концов, а пустые связи обозначают нулём. В неориентированном графе ребро AB означает связь в обе стороны, поэтому отмечают и ячейку (A, B), и (B, A); отсюда возникает симметрия матрицы.
В ориентированном графе стрелка задаёт направление перехода, поэтому ячейка (A, B) означает дугу из A в B, а не просто соседство. Для дуги A→B отмечают запись в строке A и столбце B; обратная ячейка появится только при наличии дуги B→A. По тому же принципу строят список смежности: в список A включают B, если из A выходит дуга в B.
Матрицу инцидентности строят иначе: сначала каждому ребру назначают отдельный столбец, а затем отмечают в нём его концы. Для неориентированного ребра отмечают обе вершины, с которыми оно соединено; так видно, какие именно вершины относятся к каждому ребру. В ориентированном графе направление нужно сохранить отдельно: часто в столбце ставят −1 у начала дуги и +1 у конца, но конкретное соглашение следует указать и применять последовательно.
У матрицы смежности число ячеек определяется числом вершин, даже если рёбер мало. Списки хранят главным образом существующие связи, поэтому подходят разреженным графам; при этом матрица удобна, когда алгоритму часто нужно узнать, есть ли ребро между конкретными вершинами. Список рёбер также экономит записи для графа с небольшим числом связей, а выбор формата влияет на расход памяти и скорость операций программы.
| Характеристика | Матрица смежности | Матрица инцидентности | Список смежности | Список рёбер |
|---|---|---|---|---|
| Что обозначают строки и столбцы | Строки и столбцы — вершины | Строки — вершины, столбцы — рёбра | Отдельная запись для каждой вершины | Строки — отдельные рёбра |
| Как показывается наличие ребра | В ячейке пары вершин | Отметками в столбце соответствующего ребра | В перечне соседей вершины | Парой соединённых вершин |
| Как учитываются направление и вес | Направление — порядком ячеек; вес — значением ячейки | Направление задают знаками или соглашением; вес записывают отдельно | Направление — выбором списка начала дуги; вес можно добавить к соседу | Порядок пары задаёт направление; вес добавляют к паре |
| Объём записи для графа с большим числом рёбер | Около n² ячеек | Около n·m элементов | Связан с числом вершин и рёбер | Пропорционален числу рёбер |
| Как проверить связь двух вершин | Посмотреть одну ячейку | Найти столбец ребра и проверить его концы | Просмотреть список соседей одной вершины | Найти нужную пару в перечне |
| Для каких задач удобно использовать | Для быстрой проверки связи пары вершин | Для анализа связи вершин с отдельными рёбрами | Для обхода соседей и разреженных графов | Для хранения и последовательного перебора рёбер |
Сначала определите, что именно требуется найти: связь пары вершин, соседей одной вершины или полный перечень рёбер. Затем оцените, много ли рёбер относительно возможного числа связей. Для разреженного графа чаще выбирают списки, а для частых проверок конкретной пары — матрицу смежности.
Задача 1. Для графа с вершинами A, B, C и рёбрами AB и BC составьте матрицу смежности. Граф неориентированный, поэтому каждое ребро соединяет вершины в обе стороны. Нужно расположить вершины одинаково по строкам и столбцам и отметить все существующие связи.
Ответ: матрица смежности имеет вид: строки и столбцы A, B, C; строка A — 0, 1, 0; строка B — 1, 0, 1; строка C — 0, 1, 0.
Задача 2. Для ориентированного графа с дугами A→B, C→A и B→C составьте списки смежности. Здесь важно перечислить не всех соседей, а только конечные вершины дуг, выходящих из каждой вершины. Поэтому направление проверяем отдельно для каждого начала дуги.
Ответ: A: B; B: C; C: A. Например, A не записывают в список B, поскольку дуги B→A в условии нет.
Задача 3. Взвешенный граф задан парами вершин и весами; требуется представить его списком смежности и матрицей смежности, а затем сравнить форматы для разреженного графа. Обозначим число вершин через n, а число рёбер — через m. Так как конкретные пары и веса не заданы, запишем общий порядок действий и сравним объём хранения.
Ответ: веса сохраняются рядом с соответствующими соседями или в ячейках матрицы. При малом m относительно n² список смежности обычно компактнее для разреженного графа.
Матрицу смежности неориентированного графа иногда считают произвольной и записывают связь только в одну ячейку. Так происходит, если забыть, что ребро не имеет направления и означает взаимное соседство вершин. Проверьте пары ячеек относительно главной диагонали: значения (A, B) и (B, A) должны совпадать.
Для ориентированной дуги бывает ошибочно отмечают обе ячейки матрицы смежности, будто направление не имеет значения. Причина — смешение понятий «связаны» и «из одной вершины можно перейти в другую». Сверьте строку и столбец с направлением стрелки: дуга A→B отмечается как переход из A в B, а обратная запись нужна только для B→A.
Матрицу смежности можно перепутать с матрицей инцидентности, поскольку обе формы выглядят как таблицы. Но в матрице смежности и строки, и столбцы — вершины, а в матрице инцидентности столбцы соответствуют рёбрам. Перед заполнением подпишите заголовки строк и столбцов: это сразу показывает, какие объекты сопоставляются.
В списке смежности иногда перечисляют все вершины графа для каждой строки, а не только соседей данной вершины. Тогда список перестаёт показывать конкретные связи и становится избыточным. Проверяйте каждый элемент: он должен соответствовать ребру или исходящей дуге именно из вершины, для которой составлен список.
Для работы с представлениями графов нужно знать, что такое вершина, ребро, ориентированный и неориентированный граф, а также уметь читать рисунок графа. На этих знаниях строятся алгоритмы поиска путей, обхода вершин и анализа связей в сетях. В программировании выбор структуры данных определяет расход памяти и скорость операций, поэтому представление подбирают под конкретную задачу.
Почему матрица смежности неориентированного графа симметрична?
Если вершины A и B соединены неориентированным ребром, то A соседствует с B и B соседствует с A. Поэтому значения в ячейках (A, B) и (B, A) одинаковы, а матрица симметрична относительно главной диагонали.
Как в матрице смежности показать вес ребра?
Вместо единицы в ячейке записывают вес ребра, например расстояние или стоимость перехода. Если ребра между вершинами нет, используют условное обозначение отсутствия связи — например, 0 или ∞, в зависимости от принятой договорённости.
Чем список смежности отличается от списка рёбер?
Список смежности для каждой вершины отдельно перечисляет её соседей. Список рёбер содержит перечень самих соединений — пары вершин, а для взвешенного графа также их веса.
Как записать ориентированное ребро в списке смежности?
Для каждой вершины перечисляют те вершины, в которые выходят дуги из неё. Например, для дуги A→B вершина B попадёт в список A, но A не попадёт в список B только из-за этой дуги.
Какой способ представления графа занимает меньше памяти?
Для разреженного графа, где рёбер мало по сравнению с числом возможных соединений, обычно компактнее список смежности или список рёбер. Матрица смежности хранит ячейку для каждой пары вершин и может расходовать больше памяти. Точный выбор зависит от задачи и формата хранения.
§ 52. Способы представления графов