Функция, возвращающая значение, отличное от того, что находится в теле функции перед оператором возврата - PullRequest
0 голосов
/ 13 декабря 2018

Я пишу функцию, которая возвращает путь между двумя узлами в минимальном остовном дереве, созданном с использованием алгоритма Крускала

map<string, set<string>> mst = { "A" : ["B"]
                                 "B" : ["A", "C", "D"]
                                 "C" : ["B"]
                                 "D" : ["B", "E"]
                                 "E" : ["D"] }

Алгоритм поиска пути выглядит следующим образом:

vector<string> findPath(map<string, set<string>> mst, string src, string dest, vector<string> path) {
    if(src == dest) {
        cout << "Function path size: " << path.size() << endl;
        return path;
    }
    set<string> possible = mst[src];
    for(vector<string>::iterator it = path.begin(); it != path.end(); it++) {
        if(possible.find(*it) != possible.end())
            possible.erase(*it);
    }
    for(set<string>::iterator it = possible.begin(); it != possible.end(); it++) {
        vector<string> a = path;
        if(find(a.begin(), a.end(), src) == a.end())
                a.push_back(src);
        vector<string> p = findPath(mst, *it, dest, a);
        if(p[0] != "randValue") {
            return path;
        }
    }
    vector<string> p = path;
    p[0] = "randValue";
    return p;
}

Если я вызываю функцию:

vector<string> path;
path = findPath(mst, "A", "C", path);
cout << "Main path size: " << path.size() << endl;

Вывод:

Function path size: 2
Main path size: 0

Почему функция не возвращает заполненный путь?

1 Ответ

0 голосов
/ 13 декабря 2018

Я обнаружил проблему в своей функции, решение было просто заменить одну переменную:

vector<string> findPath(map<string, set<string>> mst, string src, string dest, vector<string> path) {
    if(src == dest) {
        cout << "Function path size: " << path.size() << endl;
        return path;
    }
    set<string> possible = mst[src];
    for(vector<string>::iterator it = path.begin(); it != path.end(); it++) {
        if(possible.find(*it) != possible.end())
            possible.erase(*it);
    }
    for(set<string>::iterator it = possible.begin(); it != possible.end(); it++) {
        vector<string> a = path;
        if(find(a.begin(), a.end(), src) == a.end())
                a.push_back(src);
        vector<string> p = findPath(mst, *it, dest, a);
        if(p[0] != "randValue") {
            /**
             * RETURN p INSTEAD OF path
             */
            return p;
        }
    }
    vector<string> p = path;
    p[0] = "randValue";
    return p;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...