kuvshinovdr / OGxx

Object-oriented graph algorithm library in C++ developed for educational purposes.
MIT License
1 stars 1 forks source link

is_star #81

Closed kuvshinovdr closed 10 months ago

kuvshinovdr commented 10 months ago

Создать файл source/is_star.cpp. В нём определить функцию is_star:

#include <ogxx/iterator.hpp>
#include <ogxx/graph_view.hpp>
#include <optional>

namespace ogxx
{
    auto is_star(Index_iterator_uptr vertices, Graph_view const& gv)
        -> std::optional<Vertex_index> { ... }
}

Функция принимает заданную итератором vertices последовательность индексов вершин подграфа графа gv и возвращает либо {} (пустой объект optional), если этот подграф не является звездой, или индекс вершины этого подграфа, которая стоит в центре звезды.

Схема работы: для каждой из перечисленных вершин считаем, сколько перечисленных вершин являются её соседями ("степень"). В звезде из n вершин имеем (n-1) вершину со степенью 1 и одну вершину со степенью (n-1), которая и будет центром звезды.

mishlaw commented 10 months ago

Задание выполнено, проверьте пожалуйста

kuvshinovdr commented 10 months ago

Нет нужды передавать длину вектора, если мы сам вектор передаём. Функция подсчёта степени вершины может быть упрощена (и немного исправлена, т.к. index это уже номер из vertex, не надо снова по нему обращаться в vertex) до:

auto get_deg_vertex(Vertex_index index, std::vector<Vertex_index>& vertex, Graph_view const& gv) { 
// Get the degree of the vertex
        size_t deg=0;
        for (auto v: vertex) {
            if (gv.are_connected(index, v)) {
                deg++;
            }
        }
        return deg;
    }

Не следует использовать int для представления длины вектора, поскольку int может иметь (и имеет на моей системе) разрядность меньшую, чем size_t -- целочисленный тип без знака, предназначенный (в C и C++) для представления размеров объектов в памяти. Соответственно, из-за пропажи верхних разрядов при присваивании значения size_t (размер вектора) переменной типа int могут происходить разные неприятности:

auto const len = vertex.size(); // size_t
size_t sum = 0;
Vertex_index center = -1;

В остальном нормально, задача засчитана.

kuvshinovdr commented 10 months ago

Исправленный код отправлен в вашу ветку, рекомендую посмотреть изменения.

kuvshinovdr commented 10 months ago

Код добавлен в main.