Я все еще новичок в графах и строю взвешенный ориентированный граф для школьного проекта. Мне удалось выполнить все функции, кроме той, которая находит минимально взвешенный путь от узла к другому. Я могу найти путь, но не знаю, как сохранить все пути, а затем получить минимальный взвешенный. Мой график представлен вектором.
Я создал вспомогательную функцию, которая дает мне путь от источника к месту назначения, и функцию, которая находит вес пути. Они оба работают, но я не могу заставить тот, который находит путь, найти все пути вместо первого найденного.
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;
}
main()
и операторы#include
, а затем сократить свой код до наименьшей возможной программы, которая создает вашу проблему. Мы называем это минимально воспроизводимым примером. Это позволяет участникам копировать, вставлять, компилировать, а затем помогать вам. - person Gardener   schedule 17.04.2019InsertArc
иGetPathWeight
отсутствуют в определении класса. Не хватает#endif
. Это неполное. MCVE будет иметь все в одном файле, если проблема не связана с проблемой компоновки и со всеми входными данными, жестко запрограммированными, если проблема не связана с проблемой ввода. Не минимально, и без входных данных это не поддается проверке. Тем не менее, реальная цель MCVE состоит в том, чтобы устранить необходимость задавать вопросы. Трудно создать MCVE, не обнаружив и не исправив ошибку. - person user4581301   schedule 17.04.2019