weixin_45924746 2019-11-24 22:22 采纳率: 0%
浏览 2439

引发了未经处理的异常:读取访问权限冲突。 this->**matrix** 是 0xCDDDCDDE。

可从后往前看,来自学生党的求助,缺的都是iostream

#include "pch.h",

#include "Graph.h"

Edge::Edge()
{
from = -1;
to = -1;
weight = 0;
}

Edge::Edge(int f, int t, int w)
{
from = f;
to = t;
weight = w;
}

Graph::Graph()
{
}

Graph::Graph(int numVert)
{
numVertex = numVert;
numEdge = 0;
Indegree = new int[numVertex];
Mark = new int[numVertex];
for (int i = 0; i < numVertex; i++)
{
Mark[i] = UNVISITED;
Indegree[i] = 0;
}
}

Graph::~Graph()
{
delete[] Mark;
delete[] Indegree;
}

bool Graph::IsEdge(Edge oneEdge)
{
if (oneEdge.weight > 0 && oneEdge.weight < INFINITYS && oneEdge.to >= 0)
return true;
else
return false;
}

void Graph::clearVisitedMark()
{
for (int i = 0; i < numVertex; i++)
Mark[i] = UNVISITED;
}

#pragma once
#include

using namespace std;

#define MAX 102
#define INFINITYS 65536
#define UNVISITED 0
#define VISITED 1

#ifndef GRAPH_H
#define GRAPH_H

class Edge
{
public:
Edge();
Edge(int f, int t, int w);
~Edge() {}
bool operator < (const Edge &arg) { return (this->weight < arg.weight); }
bool operator == (const Edge &arg) { return (this->weight == arg.weight); }
bool operator > (const Edge &arg) { return (this->weight > arg.weight); }
bool operator <= (const Edge &arg) { return (this->weight <= arg.weight); }
bool operator >= (const Edge &arg) { return (this->weight >= arg.weight); }

int from;
int to;
int weight;

};

class Graph
{
public:
Graph();
Graph(int numVert);
virtual ~Graph();
int VerticesNum() { return numVertex; }
int EdgesNum() { return numEdge; }
bool IsEdge(Edge oneEdge);
int FromVertex(Edge oneEdge) { return oneEdge.from; }
int ToVertex(Edge oneEdge) { return oneEdge.to; }
int Weight(Edge oneEdge) { return oneEdge.weight; }
void clearVisitedMark();
/*virtual Edge FirstEdge(int oneVertex) = 0;
virtual Edge NextEdge(Edge preEdge) = 0;
virtual void setEdge(int from, int to, int weight) = 0;
virtual void delEdge(int from, int to) = 0;*/

protected:
int numVertex;
int numEdge;
int * Mark;
int * Indegree;
};

#endif // !GRAPH_H

#include "pch.h"
#include "Graphm.h"

Graphm::Graphm()
{
}

Graphm::~Graphm()
{
for (int i = 0; i < numVertex; i++)
delete[] matrix[i];
delete[] matrix;
}

Edge Graphm::FristEdge(int oneVertex)
{
Edge myEdge;
myEdge.from = oneVertex;
for (int i = 0; i < numVertex; i++)
if (matrix[oneVertex][i] != 0 && matrix[oneVertex][i] < INFINITYS)
{
myEdge.to = i;
myEdge.weight = matrix[oneVertex][i];
break;
}
return myEdge;
}

Edge Graphm::NextEdge(Edge preEdge)
{
Edge myEdge;
myEdge.from = preEdge.from;
if (preEdge.to < numVertex)
for (int i = preEdge.to + 1; i < numVertex; i++)
if (matrix[preEdge.from][i] != 0 && matrix[preEdge.from][i] < INFINITYS)
{
myEdge.to = i;
myEdge.weight = matrix[preEdge.from][i];
break;
}
return myEdge;
}

void Graphm::setEdge(int from, int to, int weight)
{
if (matrix[from][to] <= 0)
{
numEdge++;
Indegree[to]++;
}
matrix[from][to] = weight;
}

void Graphm::delEdge(int from, int to)
{
if (matrix[from][to] > 0)
{
numEdge--;
Indegree[to]--;
}
matrix[from][to] = 0;
}

void Graphm::InitWith2DimArray(int * mat, int row_col)
{
for (int i = 0; i < row_col; i++)
for (int j = 0; j < row_col; j++)
{
cout << *(mat + i * row_col + j) << ", \n";
this->setEdge(i, j, *(mat + i * row_col + j));
}
cout << endl;
}

void Graphm::DFS_ConnectedSubGraph(int n)
{
this->Mark[n] = VISITED;
Visit(n);
for (Edge e = this->FristEdge(n); this->IsEdge(e); e = this->NextEdge(e))
if (this->Mark[this->ToVertex(e)] == UNVISITED)
DFS_ConnectedSubGraph(this->ToVertex(e));
}

void Graphm::BFS_ConnectedSubGraph(int n)
{
queue Q;
Visit(n);
Mark[n] = VISITED;
Q.push(n);
while (! Q.empty())
{
int u = Q.front();
Q.pop();
for(Edge e = FristEdge(u); IsEdge(e); e = NextEdge(e))
if (Mark[ToVertex(e)] == UNVISITED)
{
Visit(ToVertex(e));
Mark[ToVertex(e)] = VISITED;
Q.push(ToVertex(e));
}
}
}

#pragma once
#include "Graph.h"
#include

#ifndef GRAGHM_H
#define GRAGHM_H

class Graphm :
public Graph
{
public:
Graphm();
Graphm(int n) : Graph(n)
{
int i;
matrix = (int **) new int *[numVertex];
for (i = 0; i < numVertex; i++)
matrix[i] = new int[numVertex];
for (i = 0; i < numVertex; i++)
for (int j = 0; j < numVertex; j++)
matrix[i][j] = 0;
}
~Graphm();
Edge FristEdge(int oneVertex);
Edge NextEdge(Edge preEdge);
void setEdge(int from, int to, int weight);
void delEdge(int from, int to);
void InitWith2DimArray(int * mat, int row_col);
void DFS_ConnectedSubGraph(int n);
void BFS_ConnectedSubGraph(int n);
void Visit(int n) { cout << 'n' << n << " \n"; }

//private:
int ** matrix;
};

#endif // !GRAGHM_H

// main.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include
#include "Floyd.h"

const int const vertexesNum = 5;

int matrix1[vertexesNum][vertexesNum] =
{
0 , 8 , INFINITYS, 4 , 3 ,
INFINITYS, 0 , INFINITYS, INFINITYS, 8 ,
6 , 7 , 0 , 10 , 2 ,
INFINITYS, INFINITYS, INFINITYS, 0 , INFINITYS,
5 , 5 , INFINITYS, INFINITYS, 0
};

int BrokerToPassRomour(Graphm & G, Dist ** D);

int main()
{
std::cout << "Hello World!\n";
Graphm mat[vertexesNum];
mat->InitWith2DimArray((int )matrix1, vertexesNum);
cout << endl;
cout << "深度优先周游:\n" << endl;
int i;
for (i = 0; i < vertexesNum; i++)
{
mat->clearVisitedMark();
mat->DFS_ConnectedSubGraph(i);
cout << endl;
}
cout << endl;
cout << "广度优先周游:\n" << endl;
for (i = 0; i < vertexesNum; i++)
{
mat->clearVisitedMark();
mat->BFS_ConnectedSubGraph(i);
cout << endl;
}
cout << endl;
Dist *
floydResult;
createFloydResult(floydResult, vertexesNum);
int startVertex = BrokerToPassRomour(mat[0], floydResult);
cout << "所有顶点间的最短路径:\n" << endl;
printAllDistances(floydResult, vertexesNum);
cout << endl;
for (i = 0; i < vertexesNum; i++)
for (int j = 0; j < vertexesNum; j++)
if (i != j)
printOnePath(floydResult, vertexesNum, i, j);
cout << endl;
deleteFloydResult(floydResult, vertexesNum);
if (startVertex >= 0)
cout << "谣言应从 n \n" << startVertex << " 点开始传播!\n" << endl;
else
cout << "图不连通,问题无解 \n" << endl;
return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

int BrokerToPassRomour(Graphm & G, Dist ** D)
{
int * max;
max = new int[G.VerticesNum()];
int min = 0;
int pos = 0;
int i = 0;
for (i = 0; i < G.VerticesNum(); i++)
max[i] = -1;
Floyd(G, D);
for (i = 0; i < G.VerticesNum(); i++)
for (int j = 0; j < G.VerticesNum(); j++)
if (D[i][j].length > max[i])
max[i] = D[i][j].length;
min = max[0];
for (i = 1; i < G.VerticesNum(); i++)
if (max[i] < min)
{
min = max[i];
pos = i;
}
if (min == INFINITYS)
{
cout << "此图不连通 \n" << endl;
return -1;
}
return pos;
}

// pch.cpp: 与预编译标头对应的源文件;编译成功所必需的

#include "pch.h"

// 一般情况下,忽略此文件,但如果你使用的是预编译标头,请保留它。

// 入门提示:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

#ifndef PCH_H
#define PCH_H

// TODO: 添加要在此处预编译的标头

#endif //PCH_H

#include "pch.h"
#include "Floyd.h"

void createFloydResult(Dist **& D, int vertexesNum)
{
D = new Dist *[vertexesNum];
for (int i = 0; i < vertexesNum; i++)
D[i] = new Dist[vertexesNum];
}

void deleteFloydResult(Dist **& D, int vertexesNum)
{
for (int i = 0; i < vertexesNum; i++)
delete[] D[i];
delete[] D;
D = NULL;
}

void printAllDistances(Dist ** D, int vertexesNum)
{
for (int i = 0; i < vertexesNum; i++)
{
for (int j = 0; j < vertexesNum; j++)
cout << D[i][j].length << " , \n";
cout << endl;
}
}

void printOnePath(Dist ** D, int vertexesNum, int start, int end)
{
if (D[start][end].length == INFINITYS)
return;
int * path = new int[vertexesNum];
int vertexCount = 0;
int tail = end;
while (tail != start)
{
path[vertexCount++] = D[start][tail].pre;
tail = D[start][tail].pre;
}
cout << "n" << start << "->n" << end << " : ";
for (int i = vertexCount - 1; i >= 0; i--)
cout << "n" << path[i] << "->";
cout << "n" << end << endl;
delete[] path;
}

void Floyd(Graphm & G, Dist ** D)
{
int i, j, v;
D = new Dist *[G.VerticesNum()];
for (i = 0; i < G.VerticesNum(); i++)
D[i] = new Dist[G.VerticesNum()];
for (i = 0; i < G.VerticesNum(); i++)
for (j = 0; j < G.VerticesNum(); j++)
{
if (i == j)
{
D[i][j].length = 0;
D[i][j].pre = i;
}
else
{
D[i][j].length = INFINITYS;
D[i][j].pre = -1;
}
}
for (i = 0; i < G.VerticesNum(); i++)
for (Edge e = G.FristEdge(i); G.IsEdge(e); e = G.NextEdge(e))
{
D[i][G.ToVertex(e)].length = G.Weight(e);
D[i][G.ToVertex(e)].pre = i;
}
for (v = 0; v < G.VerticesNum(); v++)
for (i = 0; i < G.VerticesNum(); i++)
for (j = 0; j < G.VerticesNum(); j++)
if (D[i][j].length > (D[i][v].length + D[v][j].length))
{
D[i][j].length = D[i][v].length + D[v][j].length;
D[i][j].pre = D[v][j].pre;
}
}

#pragma once
#include "Graphm.h"

#ifndef FLOYD_H
#define FLOYD_H

class Dist
{
public:
Dist() {}
~Dist() {}

int index;
int length;
int pre;

bool operator < (const Dist &arg)  { return (length < arg.length); }
bool operator == (const Dist &arg) { return (length == arg.length); }
bool operator > (const Dist &arg)  { return (length > arg.length); }
bool operator <= (const Dist &arg) { return (length <= arg.length); }
bool operator >= (const Dist &arg) { return (length >= arg.length); }

};

void createFloydResult(Dist ** &D, int vertexesNum);
void deleteFloydResult(Dist ** &D, int vertexesNum);
void printAllDistances(Dist ** D, int vertexesNum);
void printOnePath(Dist ** D, int vertexesNum, int start, int end);

void Floyd(Graphm &G, Dist ** D);

#endif // !FLOYD_H


"Graphm.cpp":
#include "pch.h"
#include "Graphm.h"

Graphm::Graphm()
{
}

Graphm::~Graphm()
{
for (int i = 0; i < numVertex; i++)
delete[] matrix[i];
delete[] matrix;
}

Edge Graphm::FristEdge(int oneVertex)
{
Edge myEdge;
myEdge.from = oneVertex;
for (int i = 0; i < numVertex; i++)
if (matrix[oneVertex][i] != 0 && matrix[oneVertex][i] < INFINITYS)
{
myEdge.to = i;
myEdge.weight = matrix[oneVertex][i];
break;
}
return myEdge;
}

Edge Graphm::NextEdge(Edge preEdge)
{
Edge myEdge;
myEdge.from = preEdge.from;
if (preEdge.to < numVertex)
for (int i = preEdge.to + 1; i < numVertex; i++)
if (matrix[preEdge.from][i] != 0 && matrix[preEdge.from][i] < INFINITYS)
{
myEdge.to = i;
myEdge.weight = matrix[preEdge.from][i];
break;
}
return myEdge;
}

void Graphm::setEdge(int from, int to, int weight)
{
if (matrix[from][to] <= 0)
{
numEdge++;
Indegree[to]++;
}
matrix[from][to] = weight;
}

void Graphm::delEdge(int from, int to)
{
if (matrix[from][to] > 0)
{
numEdge--;
Indegree[to]--;
}
matrix[from][to] = 0;
}

void Graphm::InitWith2DimArray(int * mat, int row_col)
{
for (int i = 0; i < row_col; i++)
for (int j = 0; j < row_col; j++)
{
cout << *(mat + i * row_col + j) << ", \n";
this->setEdge(i, j, *(mat + i * row_col + j));
}
cout << endl;
}

void Graphm::DFS_ConnectedSubGraph(int n)
{
this->Mark[n] = VISITED;
Visit(n);
for (Edge e = this->FristEdge(n); this->IsEdge(e); e = this->NextEdge(e))
if (this->Mark[this->ToVertex(e)] == UNVISITED)
DFS_ConnectedSubGraph(this->ToVertex(e));
}

void Graphm::BFS_ConnectedSubGraph(int n)
{
queue Q;
Visit(n);
Mark[n] = VISITED;
Q.push(n);
while (! Q.empty())
{
int u = Q.front();
Q.pop();
for(Edge e = FristEdge(u); IsEdge(e); e = NextEdge(e))
if (Mark[ToVertex(e)] == UNVISITED)
{
Visit(ToVertex(e));
Mark[ToVertex(e)] = VISITED;
Q.push(ToVertex(e));
}
}
}


第51行
if (matrix[from][to] <= 0)
//void Graphm::setEdge(int from, int to, int weight)
引发了未经处理的异常:读取访问权限冲突。
this->matrix 是 0xCDDDCDDE

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2019-11-25 12:50
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料