Есть реализация графа через матрицу смежности. Но у меня получился ступор при реализации алгоритмов обхода и алгоритма Прима.
Растолкуйте, кто может, как реализовать.
Ниже привожу написанный класс взвешенного, неориентированного графа.
Код:
class CGraph
{
public:
CGraph(): count(0),count_rib(0), matrix_val(NULL) {}
CGraph(int _count);
~CGraph();
bool isEmpty() {return count==0;}
void Print();
void AddRib(int A,int B,int val);
void DelRib(int A,int B);
bool isRib(int A, int B);
int CountOfRib() {return count_rib;}
int CountOfTip() {return count;}
void AddTip();
void DelTip(int A);
int DegreeOfTip(int A);
void dfs(int u);
void Floid();
private:
int** matrix_val;
int count;
int count_rib;
};
Код:
#include "stdafx.h"
#include <stdio.h>
#include "CGraph.h"
CGraph::CGraph(int _count)
{
count = _count;
count_rib=0;
matrix_val = new int*[count];
for(int i = 0;i < count;i++)
{
matrix_val[i] = new int[count];
for(int j = 0;j < count;j++) matrix_val[i][j] = 0x0FFFFFFF;
}
}
CGraph::~CGraph()
{
if(count > 0)
{
for(int i = 0;i < count;i++) delete [] matrix_val[i];
delete [] matrix_val;
}
count=count_rib=0;
}
void CGraph::Print()
{
for(int i = 0;i < count;i++)
{
for(int j = 0;j < count;j++)
{
if(i == j) break;
if(matrix_val[i][j] != 0x0FFFFFFF) printf("%d -- %d [%d]\n",i + 1,j + 1,matrix_val[i][j]);
}
}
}
void CGraph::AddRib(int A,int B,int val)
{
if(A > count) return;
if(B > count) return;
A--;
B--;
matrix_val[A][B] = val;
matrix_val[B][A] = val;
count_rib++;
}
void CGraph::DelRib(int A,int B)
{
if(A > count) return;
if(B > count) return;
A--;
B--;
matrix_val[A][B] = 0x0FFFFFFF;
matrix_val[B][A] = 0x0FFFFFFF;
count_rib--;
}
bool CGraph::isRib(int A, int B)
{
return matrix_val[A][B]!=0x0FFFFFFF;
}
void CGraph::AddTip()
{
int** _matrix_val;
_matrix_val = new int*[count + 1];
for(int i = 0;i < count + 1;i++)
{
_matrix_val[i] = new int[count + 1];
for(int j = 0;j < count + 1;j++)
{
_matrix_val[i][j] = 0x0FFFFFFF;
}
}
if(count > 0)
{
for(int i = 0;i < count;i++)
{
for(int j = 0;j < count;j++)
{
_matrix_val[i][j] = matrix_val[i][j];
}
delete [] matrix_val[i];
}
delete matrix_val;
}
matrix_val = _matrix_val;
count++;
}
void CGraph::DelTip(int A)
{
if(A > count) return;
A--;
for(int i = 0;i < count;i++)
{
matrix_val[A][i] = 0x0FFFFFFF;
matrix_val[i][A] = 0x0FFFFFFF;
}
if(count > 1)
{
int** _matrix_val;
_matrix_val = new int*[count - 1];
for(int i = 0;i < count - 1;i++)
{
_matrix_val[i] = new int[count - 1];
for(int j = 0;j < count - 1;j++)
{
_matrix_val[i][j] = 0x0FFFFFFF;
}
}
for(int i = 0;i < count;i++)
{
if(i < A)
{
for(int j = 0;j < count;j++)
{
if(j < A)
{
_matrix_val[i][j] = matrix_val[i][j];
}
else if(j > A)
{
_matrix_val[i][j - 1] = matrix_val[i][j];
}
}
}
else if(i > A)
{
for(int j = 0;j < count;j++)
{
if(j < A)
{
_matrix_val[i - 1][j] = matrix_val[i][j];
}
else if(j > A)
{
_matrix_val[i - 1][j - 1] = matrix_val[i][j];
}
}
}
delete [] matrix_val[i];
}
delete matrix_val;
matrix_val = _matrix_val;
}
else
{
matrix_val = NULL;
}
count--;
}
int CGraph::DegreeOfTip(int A)
{
A--;
int degree = 0;
for(int i = 0;i < count;i++)
{
if(matrix_val[A][i] != 0x0FFFFFFF) degree++;
}
return degree;
}
void CGraph::dfs(int u)
{
}
void CGraph::Floid()
{
}