@Davidaa_WoW

Почему возникает проблема с подсчётом диаметра графа?

Есть значит граф:
struct list {
    int data;
    int firstPeak;
    int secondPeak;
    list* next = 0;
};

struct graph {
    int data;
    list* List = new list;
};

Связи заданы списком смежных рёбер.

Вот как они добавляются:
void addEdgeRec(list*& List, int firstPeak, int secondPeak, int data) {
    if (List->next == 0) {
        List->data = data;
        List->firstPeak = firstPeak;
        List->secondPeak = secondPeak;
        List->next = new list;
        return;
    }
    addEdgeRec(List->next, firstPeak, secondPeak, data);
}

graph* addEdge(graph graph[], int firstPeak, int secondPeak, int data) {
    addEdgeRec(graph[firstPeak - 1].List, graph[firstPeak-1].data, graph[secondPeak-1].data, data);
    addEdgeRec(graph[secondPeak - 1].List, graph[secondPeak-1].data, graph[firstPeak - 1].data, data);
    return graph;
}


Нужны функции подсчёта диаметра, те, которые я составил по своей задумке почему-то не работают, как надо. Функции:
int findLength(list* List, int a, int counter = 0) {
    if (List->secondPeak == a) {
        return counter;
    }
    if (List->next == 0) {
        return counter;
    }
    return findLength(List->next, a, counter + 1);
}

int findMax(list * List, int size) {
    int* arr = new int[size];
    for (int a = 0; a < size; a++) {
        if (a == List->firstPeak) {
            arr[a] = 0;
            continue;
        }
        if (a == List->secondPeak) {
            arr[a] = 1;
            continue;
        }
        arr[a] = findLength(List, a);
    }
    int max = arr[0];
    for (int a = 1; a < size; a++) {
        if (arr[a] > max) {
            max = arr[a];
        }
    }
    return max;
}

int findDiameter(graph Graph[], int size) {
    int* arr = new int[size];
    for (int a = 0; a < size; a++) {
        arr[a] = findMax(Graph[a].List, size);
    }
    int max = arr[0];
    for (int a = 1; a < size; a++) {
        if (arr[a] > max) {
            max = arr[a];
        }
    }
    return max;
}

Пример ввода (1 вершина, 2 вершина, данные):
1 2 0
2 3 0
3 4 0

Диаметр графа - 3, а программа выводит 2.
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Во-первых, у вас структура весьма странная. Вообще непонятно, что у вас там за пики, почему при добавлении ребра участвует data в вершинах.

Вместо собственных list-ов, вы храните ребра в vector. По производительности будет даже быстрее из-за локальности. А добавление в вектор один раз кучи элементов работает за линейную сложность. Но если вам надо собственную реализацию, то вы всегда добавляйте в начало списка. Потому что рекурсивный поиск конца списка и добавление туда - это квадратичный алгоритм на ровном месте.

Опишите ваш алгоритм словами, что должна делать функция findLength? Искать позицию заданного элемента в списке?

Похоже у вас граф взвешанный, и единственный доступный вам способ в таком графе - это поиск кратчайших путей от каждой вершины до каждой. Тут хорошо подойдет алгоритм Флойда. Или, если у вас граф разряжен - Дейкстры.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы