主程序:
#include <stdlib.h>
#include <iostream>
#include "AdjacencyMatrix.h"
void Prim(Matrix*, int*, int);
int minVertex(Matrix*, int*);
int main() {
Matrix M(6);
int weight = 0;
Prim(M,weight,0);
system("pause");
return 0;
}
void Prim(Matrix*G, int*D, int s) { // Prim’s MST algorithm
int VISITED = 1;
int UNVISITED = 0;
int V[6]; // Store closest vertex
int i, w;
for (int i=0; i<G->n(); i++) // Initialize
D[i] = INFINITY;
D[s] = 0;
for (i=0; i<G->n(); i++) { // Process the vertices
int v = minVertex(G, D);
G->setMark(v, VISITED);
//if (v != s)
// AddEdgetoMST(V[v], v); // Add edge to MST
if (D[v] == INFINITY) return; // Unreachable vertices
for (w=G->first(v); w<G->n(); w = G->next(v,w))
if (D[w] > G->weight(v,w)) {
D[w] = G->weight(v,w); // Update distance
V[w] = v; // Where it came from
}
}
}
这是Matrix类及其构造函数和析构函数:
#pragma once
#include <assert.h>
#include "GraphADT.h"
class Matrix : public Graph {
private:
int numVertex, numEdge; // Store number of vertices, edges
int**matrix; // Pointer to adjacency matrix
int*mark; // Pointer to mark array
int VISITED = 1;
int UNVISITED = 0;
public:
Matrix (int numVert) { Init(numVert); }
~Matrix() { // Destructor
delete [] mark; // Return dynamically allocated memory
for (int i=0; i<numVertex; i++)
delete [] matrix[i];
delete [] matrix;
void Init(int n) { // Initialize the graph
int i;
numVertex = n;
numEdge = 0;
mark = new int[n]; // Initialize mark array
for (i=0; i<numVertex; i++)
mark[i] = UNVISITED;
matrix = (int**) new int*[numVertex]; // Make matrix
for (i=0; i<numVertex; i++)
matrix[i] = new int[numVertex];
for (i = 0; i < numVertex; i++) // Initialize to 0 weights
for (int j = 0; j < numVertex; j++)
matrix[i][j] = 0;
}
int n() { return numVertex; } // Number of vertices
int e() { return numEdge; } // Number of edges
// Return first neighbor of "v"
int first(int v) {
for (int i=0; i<numVertex; i++)
if (matrix[v][i] != 0) return i;
return numVertex; // Return n if none
}
// Return v’s next neighbor after w
int next(int v, int w) {
for(int i=w+1; i<numVertex; i++)
if (matrix[v][i] != 0)
return i;
return numVertex; // Return n if none
}
// Set edge(v1, v2) to "wt"
void setEdge(int v1, int v2, int wt) {
assert(wt>0, "Illegal weight value");
if (matrix[v1][v2] == 0) numEdge++;
matrix[v1][v2] = wt;
}
void delEdge(int v1, int v2) { // Delete edge (v1, v2)
if (matrix[v1][v2] != 0) numEdge--;
matrix[v1][v2] = 0;
}
bool isEdge(int i, int j) // Is (i, j) an edge?
{ return matrix[i][j] != 0; }
int weight(int v1, int v2) { return matrix[v1][v2]; }
int getMark(int v) { return mark[v]; }
void setMark(int v, int val) { mark[v] = val; }
}
以下是我忽略的Graph
的重要部分:
class Graph {
private:
void operator =(const Graph&) {} // Protect assignment
Graph(const Graph&) {} // Protect copy constructor
}
Graph
的其余部分是纯虚函数。
我在调用Prim
函数的行上收到此错误。
完整错误为function "Matrix::Matrix(const Matrix &)" (declared implicitly) cannot be referenced -- it is a deleted function
。
我一直在寻找答案,但似乎无法理解如何解决此错误。我认为这与构造函数和析构函数有关,但我不知道如何解决该问题。
对于为什么会发生此问题以防止将来出现问题,我也将不胜感激。
此外,Prim算法直接来自我的教科书,不是原始代码。
编辑:包括完整的Matrix类以进行澄清。
答案 0 :(得分:2)
在@IgorTandetnik的指导下,我意识到我需要以除值之外的其他方式将类对象传递给函数。
为此,我更改了
Matrix M(6);
int weights = 0;
到以下
Matrix m1(6);
Matrix* M;
M = &m1;
int weights = 0;
int* w;
w = &weights;
,还将函数调用从Prim
更改为
Prim(M,w,0);
这实际上确实解决了原始问题。代码中仍然存在错误,导致weights
和m1
附近的堆栈损坏,但是由于原始问题已解决,因此问题得到了解决。
编辑:正如本(Ben)在下面的评论中所述,我的问题是Prim
试图填充一系列权重。为了解决这个问题,我将权重声明更改为int w[size]
,大小为顶点数。