Найдите минимальный взвешенный путь в векторе кортежей, представляющих граф

Я все еще новичок в графах и строю взвешенный ориентированный граф для школьного проекта. Мне удалось выполнить все функции, кроме той, которая находит минимально взвешенный путь от узла к другому. Я могу найти путь, но не знаю, как сохранить все пути, а затем получить минимальный взвешенный. Мой график представлен вектором.

Я создал вспомогательную функцию, которая дает мне путь от источника к месту назначения, и функцию, которая находит вес пути. Они оба работают, но я не могу заставить тот, который находит путь, найти все пути вместо первого найденного.

int WeightedDigraph::Myhelp(int to) const{
    for (mytup::const_iterator k = adjList.begin(); k != adjList.end(); ++k) {
        if(get<1>(*k) == to){ //destination
                return get<0>(*k); //source
        }
    }
    return 10000;
}

list<int> WeightedDigraph::FindMinimumWeightedPath(int from, int to) const {
    list<int> minpath;
    minpath.push_front(to);
    int src = Myhelp(to);
    while(src != from){
        minpath.push_front(src);
            src = Myhelp(src);
    }
    return minpath;
}

Этот код возвращает список для пути «от» до «до». Вместо этого я хочу, чтобы он возвращал тот, у которого наименьший вес. Мне нужно, чтобы функция getPathWeight(const list& path ) уже была настроена, чтобы найти вес каждого пути и сравнить их, но как я могу получить все пути в одном месте?

Обновление для минимума, рабочий пример с включает:

Main.cpp

    #include "WeightedDigraph.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;

int main(int argc, char* argv[])
{

    if(argc != 4) {
        cerr << "Incorrect number of command line arguments." << endl;
        cerr << "Usage: " << argv[0] << " <filename> <start vertex> <dest vertex>" << endl;
        exit(EXIT_FAILURE);
    }

    WeightedDigraph graph(argv[1]);

    cout << "The graph has " << graph.GetOrder() << " vertices and " << graph.GetSize() << " arcs" << endl;

    int source = atoi(argv[2]);
    int dest = atoi(argv[3]);

    if (graph.DoesPathExist(source, dest)) {
        list<int> path = graph.FindMinimumWeightedPath(source, dest);
        //then the path will be used for other functions
    return 0;
}

WeightedDiagraph.cpp:

#include "WeightedDigraph.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <limits>
#include<list>

using namespace std;


void WeightedDigraph::InsertArc(int from, int to, double weight) {
    tuple<int, int, double> newtup (from, to, weight); 
    adjList.push_back(newtup);
}

double WeightedDigraph::GetPathWeight(const list<int> & path) const {
    //working
}

//other functions that are not needed for my question

Взвешенная диаграмма.h:

#ifndef WeightedDigraph_H
#define WeightedDigraph_H

#include<list>
#include<string>
#include<vector>
#include<tuple>

using namespace std;

typedef vector<tuple<int,int,double>> mytup;

class WeightedDigraph {
public:
    mytup adjList;
    //all methods

private:
    int numVertices;
    int numArcs;

    int from;
    int to;
    double weight;

}

person user3812411    schedule 17.04.2019    source источник
comment
Было бы полезно, если бы вы могли включить функцию main() и операторы #include, а затем сократить свой код до наименьшей возможной программы, которая создает вашу проблему. Мы называем это минимально воспроизводимым примером. Это позволяет участникам копировать, вставлять, компилировать, а затем помогать вам.   -  person Gardener    schedule 17.04.2019
comment
Это хорошее место для использования классического алгоритма Дейкстры (см. соответствующий вопрос stackoverflow .com/questions/3447566/dijkstras-algorithm-in-c )   -  person cappsm    schedule 17.04.2019
comment
@Садовник, сейчас лучше? Спасибо.   -  person user3812411    schedule 17.04.2019
comment
Не могли бы вы просто суммировать все веса всех путей, а затем выбрать наименьший?   -  person Sailanarmo    schedule 17.04.2019
comment
Может быть достаточно, чтобы определить проблему, но это не минимально воспроизводимый пример. InsertArc и GetPathWeight отсутствуют в определении класса. Не хватает #endif. Это неполное. MCVE будет иметь все в одном файле, если проблема не связана с проблемой компоновки и со всеми входными данными, жестко запрограммированными, если проблема не связана с проблемой ввода. Не минимально, и без входных данных это не поддается проверке. Тем не менее, реальная цель MCVE состоит в том, чтобы устранить необходимость задавать вопросы. Трудно создать MCVE, не обнаружив и не исправив ошибку.   -  person user4581301    schedule 17.04.2019
comment
@user4581301 user4581301 будет ли ссылка на полный онлайн-проект работать?   -  person user3812411    schedule 18.04.2019
comment
@Sailanarmo, это как раз моя проблема. Я не знаю, как получить все пути в одной точке, чтобы затем проверить все веса и сравнить их.   -  person user3812411    schedule 18.04.2019
comment
@ user3812411 Намного лучше. Оптимальным было бы сделать файлы меньше и постараться поместить все в один файл. Чем длиннее файл и чем больше копий и вставок требуется для его переноса в IDE, тем медленнее участник, пока он не решит двигаться дальше. См. объяснение пользователя 4581301 выше.   -  person Gardener    schedule 18.04.2019
comment
Отсутствуют функции GetOrder(), DoesPathExist() и FindMinimumWeightedPath(). Извини, мне пора домой. Некоторые люди достаточно умны, чтобы читать код и находить ошибки. Для этого я использую компилятор и отладчик. Будем надеяться, что у кого-то из более умных участников будет время выступить в роли компилятора и прочитать код.   -  person Gardener    schedule 18.04.2019
comment
Почти наверняка ссылка на код не будет минимальной. Плюс ссылки гниют. Вопрос, который зависит от ссылок, станет бесполезным, когда ссылки исчезнут. Избегайте ссылок на код, кроме как в качестве дополнительной информации для большего контекста. Все, что, я думаю, вам нужно здесь, это подправить код, который у вас есть в вопросе, и убедиться, что он A) компилируется и B демонстрирует ошибку при запуске.   -  person user4581301    schedule 18.04.2019
comment
Краткое описание MCVE: цель MCVE — изолировать ошибку в как можно меньшем количестве кода. Это оставляет жуку негде спрятаться, и в этот момент его обычно легко убрать. Требование MCVE вынуждает запрашивающего применить мощную технику отладки и, как правило, задолго до того, как они доберутся до конечной цели, часто сами находят и устраняют ошибку. Если они сделают это до того, как зададут вопрос, велики шансы, что им больше не нужно задавать вопрос.   -  person user4581301    schedule 18.04.2019
comment
@user4581301 user4581301 Думаю, моя проблема не в ошибке, а в образе мышления. Мне просто нужно объяснение, как это должно быть сделано.   -  person user3812411    schedule 18.04.2019