Я борюсь с этой проблемой, которую я получил в курсе от 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;
}
Все время, пока я его компилирую, код ошибки говорит об ошибке сегментации. Но я очень хочу знать, где я серьезно ошибся. Спасибо:)