У меня возникла проблема с программой, над которой я работаю, которая должна считываться в матрице смежности, создавать объекты Edge, состоящие из двух вершин, а также вес соединяющего их ребра. Мой цикл чтения, кажется, работает нормально, так как при просмотре значений массива каждое из них дает правильные данные. Только когда я пытаюсь передать массив своим функциям: «minedge» и «mirror», вершины вместо этого отображаются как невероятно малые или большие числа. Я был бы очень признателен за любую помощь в устранении проблемы.
Вот матрица смежности, которую мне дают, из которой я пытаюсь создать MST:
0 0 7 0 9 0
0 0 5 0 0 6
7 5 0 3 0 2
0 0 3 0 0 2
9 0 0 0 0 1
0 6 2 2 1 0
Это мой класс для Графа, в котором я буду читать и создавать:
#ifndef GRAPH_H
#define GRAPH_H
#include "fstream"#include "Edge.h"#include <iostream>
using namespace std;
class Graph
{
public:
Graph()
{
}
~Graph()
{
}
void InitMatrix() // READS IN EACH NON-ZERO VALUE FROM GIVEN GRAPH AND CREATES EDGES.
{
fin.open("adjmatrix.txt");
for (int i = 0; i < 6 ; i++)
{
for (int j = 0; j < 6; j++)
{
fin >> tempwt;
if (tempwt > 0)
{
EdArray[cnt] = new Edge(i,j,tempwt);
cnt++;
}
}
}
}void InitMST()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
MST[i][j] = 0;
}
}
}
bool minEdge(Edge array[])
{
for (EdArrayCnt; ;EdArrayCnt++)
{
for (int i = 0; i < 16 ;i++)
{
if (array[EdArrayCnt].vertexOne() == array[i].vertexOne())
if (array[EdArrayCnt].vertexTwo() != array[i].vertexTwo())
if (array[EdArrayCnt].weight() < array[i].weight())
{
tempcnt = EdArrayCnt;
Insert(EdArrayCnt, array);
Mirror(tempcnt, array);
return true;
}
//return false;
}
}
}
bool Mirror(int cnt, Edge array[])
{
for (int i = 0; i < 16; i++)
{
cout << array[cnt].vertexOne() << " " << array[i].vertexTwo() << endl;
if (array[cnt].vertexOne() == array[i].vertexTwo())
if (array[cnt].vertexTwo() == array[i].vertexOne())
if (array[cnt].weight() == array[i].weight())
{
Insert(i, array);
return true;
}
//return false;
}
}void Insert(int loc, Edge array[])
{
MST[array[loc].vertexOne()][array[loc].vertexTwo()] = array[loc].weight();
}
void print()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
cout << MST[i][j] << " ";
}
cout << endl;
}
}void buildMatrix()
{
minEdge(*EdArray);
print();
}private:
ifstream fin;
int cnt = 0;
int tempwt, EdArrayCnt = 0, tempcnt;
Edge* EdArray[20]; //MST For Initial Graph.
int MST[6][6]; //New Graph.
};
#endif
Это класс Edge:
#ifndef EDGE_H
#define EDGE_H
using namespace std;
class Edge
{
public:
Edge()
{
}
Edge(int v, int v2, int w)
{
vertOne = v;
vertTwo = v2;
wt = w;
}
~Edge()
{
}
int vertexOne()
{
return vertOne;
}
int vertexTwo()
{
return vertTwo;
}
int weight()
{
return wt;
}
private:
int vertOne, vertTwo, wt;
};
#endif
Наконец, вот основная функция драйвера:
#include <iostream>
#include "Graph.h"
using namespace std;
int main()
{
Graph G;
G.InitMST();
G.InitMatrix();
G.buildMatrix();
system("pause");
return 0;
}
Задача ещё не решена.
Других решений пока нет …