Алгоритм Прима MST с C ++ - PullRequest
0 голосов
/ 15 апреля 2020

Я борюсь с этой проблемой, которую я получил в курсе от Coursera. Проблема в

В этой задаче программирования вы создадите алгоритм алгоритма минимального связующего дерева Prim. Загрузите текстовый файл здесь. Этот файл описывает неориентированный граф с целочисленными ребрами. Он имеет формат

[number_of_nodes] [number_of_edges] [one_node_of_edge_1] [other_node_of_edge_1] [edge_1_cost] [one_node_of_edge_2] [other_node_of_edge_2] [файл_строка_файла_2_3_], 3-й строки, пример 3-й строки, 3-й пример: строка 2 -8874 ", указывая, что существует ребро, соединяющее вершину № 2 и вершину № 3, которая имеет стоимость -8874. Вы НЕ ДОЛЖНЫ полагать, что пограничные затраты положительны, и при этом вы не должны предполагать, что они различны.

Ваша задача - запустить алгоритм минимального связующего дерева Prim на этом графике. Вы должны сообщить общую стоимость минимального связующего дерева - целое число, которое может или не может быть отрицательным - в поле ниже.

и мой Исходный код

#include <bits/stdc++.h>
using namespace std;
using pi = pair<int, int>;
class Graph

{
    int V; // # of vertices
    vector<pi>* adj; // vertex - vertex (cost)
    int total_cost;
    vector<bool> Selected;
    vector<pi> temp;
public:
    Graph(int V);
    void addEdge(int v, int w, int cost);
    void primMST(int src);
    int getTotalCost();
};

Graph::Graph(int V)
{
    this->V = V;
    adj = new vector<pi>[V+1];
    vector<bool> Selected (V+1, false);
    total_cost = 0;
    vector<pi> temp;
}

void Graph::addEdge(int v, int w, int cost)
{
    adj[v].push_back(make_pair(w, cost));
}

bool sortbysec(const pi &a, const pi &b)
{
    return a.second < b.second;
}

void Graph::primMST(int src)
{

    Selected[src] = true;

    for (vector<pi>::iterator itr = adj[src].begin(); itr != adj[src].end(); itr++)
    {
        if(Selected[(*itr).first] != true)
            temp.push_back(make_pair((*itr).first , (*itr).second));
    }
    sort(temp.begin(), temp.end(), sortbysec);

    if(!temp.empty())
    {
        int next = temp.front().first;
        total_cost += temp.front().second;
        vector<pi>::iterator itr = temp.begin();

        while (itr != temp.end())
        {
            if( (*itr).first == next)
            {
                temp.erase(itr);
                continue;
            }
            itr ++;
        }
        primMST(next);
    }
    return;
}
int Graph::getTotalCost()
{
    return total_cost;
}

int main()
{
    fstream file;
    file.open("edges.txt");
    // file.open("sample2.txt");
    int V, e;
    file >> V >> e; // v = 500,  e = 2184
    Graph g(V);

    while (file.peek() != EOF)
    {
        int v , w, cost;
        file >> v >> w >> cost;
        g.addEdge(v, w, cost);
    }


    g.primMST(1);
    int result = g.getTotalCost();
    cout << result << endl;

    return 0;
}

Все время, пока я его компилирую, код ошибки говорит об ошибке сегментации. Но я очень хочу знать, где я серьезно ошибся. Спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...