graph — Модификация реализации Prim для записи веса кратчайшего пути Переполнение стека

У меня возникли проблемы с получением этой реализации Prim для отслеживания общего веса кратчайшего пути, который он находит. Путь кажется правильным, но я не могу понять, где суммировать веса, когда они добавляются в массив, в котором хранятся пути (так как он был записан только для хранения используемых путей).

Я попытался суммировать pCrawl-> weight, когда каждая вершина добавляется в MST, но это, кажется, сумма всех весов на графике. То же самое с ключом значений [].

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

Вот код, который я использую: http://pastebin.com/TFLGCE0L

Список Смежности, который я сделал: http://pastebin.com/SvgGjEPj

И карта, использованная для его создания: карта

Функция Prim выглядит следующим образом:

// The main function that constructs Minimum Spanning Tree (MST)
// using Prim's algorithm
void PrimMST(struct Graph* graph)
{
int V = graph->V;// Get the number of vertices in graph
int parent[V];   // Array to store constructed MST
int key[V];      // Key values used to pick minimum weight edge in cut

// minHeap represents set E
struct MinHeap* minHeap = createMinHeap(V);

// Initialize min heap with all vertices. Key value of
// all vertices (except 0th vertex) is initially infinite
for (int v = 1; v < V; ++v)
{
parent[v] = -1;
key[v] = INT_MAX;
minHeap->array[v] = newMinHeapNode(v, key[v]);
minHeap->pos[v] = v;
}

// Make key value of 0th vertex as 0 so that it
// is extracted first
key[0] = 0;
minHeap->array[0] = newMinHeapNode(0, key[0]);
minHeap->pos[0]   = 0;

// Initially size of min heap is equal to V
minHeap->size = V;

// In the followin loop, min heap contains all nodes
// not yet added to MST.
while (!isEmpty(minHeap))
{
// Extract the vertex with minimum key value
struct MinHeapNode* minHeapNode = extractMin(minHeap);
int u = minHeapNode->v; // Store the extracted vertex number

// Traverse through all adjacent vertices of u (the extracted
// vertex) and update their key values
struct AdjListNode* pCrawl = graph->array[u].head;
while (pCrawl != NULL)
{
int v = pCrawl->dest;

// If v is not yet included in MST and weight of u-v is
// less than key value of v, then update key value and
// parent of v
if (isInMinHeap(minHeap, v) && pCrawl->weight < key[v])
{
key[v] = pCrawl->weight;
parent[v] = u;
decreaseKey(minHeap, v, key[v]);
}
pCrawl = pCrawl->next;
}
}

Используемые структуры выглядят так:

// A structure to represent a node in adjacency list
struct AdjListNode
{
int dest;
int weight;
struct AdjListNode* next;
};

// A structure to represent an adjacency liat
struct AdjList
{
struct AdjListNode *head;  // pointer to head node of list
};

// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
int V;
struct AdjList* array;
};
// Structure to represent a min heap node
struct MinHeapNode
{
int  v;
int key;
};

// Structure to represent a min heap
struct MinHeap
{
int size;      // Number of heap nodes present currently
int capacity;  // Capacity of min heap
int *pos;     // This is needed for decreaseKey()
struct MinHeapNode **array;
};

Я чувствую, что нахожусь в курсе этого курса по структурам данных, поэтому пытаюсь использовать код из Интернета для решения этой небольшой части задания без полного понимания: /

Спасибо,

Майкл

0

Решение

Вы делаете правильные вещи. Сумма минимальных весов (от Прима) может быть равна сумме всех весов на графике. Рассмотрим случай, когда в графе 4 узла, а узел 1 находится в центре и соединен с узлами 2, 3 и 4 с весами w. 2, 3 и 4 не связаны между собой. В этом случае вес Прима будет равен 3 * w, что соответствует общему весу. Я бы предложил вам использовать несколько разных случаев, которые бы прояснили то, что я говорю.

Редактировать:

Вот проблема, вы не обновляете сумму должным образом.
Это —

weightTotal += pCrawl->weight

должно быть —

weightTotal += pCrawl->weight - key[v]
1

Другие решения


По вопросам рекламы [email protected]