//#include<iosteram>
#include<iomanip>
#define MAX_VEXNUM 20 //最大顶点数
const int infinity = INT_MAX; //这是无穷大哦!!!
//---------------------邻接矩阵存储图---------------------------
template<class VertexType, class EdgeType>
class Gragh_Matrix
{
private:
VertexType vexs[MAX_VEXNUM]; //顶点表数组
EdgeType edges[MAX_VEXNUM][MAX_VEXNUM]; //邻接矩阵!
int vNum; //顶点数
int eNum; //边数
bool visited[MAX_VEXNUM]; //标记数组
public:
Gragh_Matrix();
~Gragh_Matrix(){}
bool CreatMGragh(); //建立有向网络图的邻接存储结构
void DisplayMGragh();//EdgeType *e); //输出邻接矩阵
VertexType GetVertexName(int i) {return this->vexs[i];} //获取顶点名称
int GetVertexNumber() {return this->vNum;} //获取顶点数
int GetEdgeNumber() {return this->eNum;} //获取弧条数
EdgeType GetEdgeWeight(VertexType v1,VertexType v2); //获取图中指定边的权值
int GetVertexIndex(const VertexType vertexName); //获取顶点在图(数组)中的位置
bool InsertVertex(const VertexType vertexname); //在图中增加一个节点(无边)
//在两点间插入一条弧
bool InsertEdge(const VertexType vertexname1,const VertexType vertexname2,const EdgeType edgeWeight);
bool DeleteVertex(const VertexType vertexname); //删除图节点
bool RemoveEdge(const VertexType vertexname1,const VertexType vertexname2); //删除弧
bool IsVertexExist(VertexType v1); //判断该顶点是否存储在图中
bool isEdgeExist(const VertexType vertexname1,const VertexType vertexname2); //判断图中的两点是否存在边
int VertexID(const VertexType vertexname);
int VertexOD(const VertexType vertexname); //出度、入度、度
int VertexAD(const VertexType vertexname);
void DFS(int index); //深度优先遍历
void DFSTraverse();
void BFS(int index); //广度优先遍历
void BFSTraverse();
};
//------------------构造函数------------------------
template<class VertexType, class EdgeType>
Gragh_Matrix<VertexType,EdgeType>::Gragh_Matrix()
{
this->eNum = 0;
this->vNum = 0;
};
//-----------------创建邻接矩阵存储图---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType,EdgeType>::CreatMGragh()
{
int i,j,k;
cout<<"请输入有向图的总顶点数和总边条数:"<<endl;
cin>>this->vNum>>this->eNum;
cout<<"请输入"<<this->vNum<<"个顶点:";
for (i=0; i<vNum; i++)
{
cin>>vexs[i];
}
for (i=0; i<vNum; i++) //初始化邻接矩阵
{
for (j=0; j<vNum; j++)
{
edges[i][j] = infinity;
}
}
VertexType v1, v2;
EdgeType w;
for (k=0; k<eNum; k++)
{
cout<<"请输入第"<<k+1<<"条边的起点、终点、权值:";
cin>>v1>>v2>>w;
int m = GetVertexIndex(v1);
int n = GetVertexIndex(v2);
edges[m][n] = w;
}
return true;
}
/*---------------获取顶点名---------------
template<class VertexType,class EdgeType>
VertexType Gragh_Matrix<VertexType,EdgeType>::GetVertexName(int i)
{
return this->vexs[i];
};*/
//---------------获取顶点在图(顶点表)中的位置---------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::GetVertexIndex(const VertexType vertexName)
{
for (int index=0; index != vNum; ++index)
{
if(vertexName == GetVertexName(index))
return index;
}
return -1;
}
//---------------输出邻接矩阵---------------
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::DisplayMGragh()
{
int i=0;
int j=0;
cout<<"该有向图有"<<vNum<<"个顶点、"<<eNum<<"条边"<<endl;
cout<<"顶点为:"<<endl;
for (; i<vNum; ++i)
cout<<vexs[i]<<" ";
cout<<endl;
cout<<"该图的邻接矩阵为:"<<endl;
for (i=0; i<vNum; ++i)
{
for (j=0; j<vNum; ++j)
{
if(edges[i][j] == infinity) cout<<setw(5)<<"∞";//<<setw(5)
else cout<<setw(5)<<edges[i][j];
}
cout<<endl;
}
}
//---------------判断图中是否存在顶点v1---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::IsVertexExist(VertexType v1)
{
int i = GetVertexIndex(v1);
if(i == -1) return false;
else return true;
}
//---------------获取图中相应边的权值(如果存在的话)---------------
template<class VertexType,class EdgeType>
EdgeType Gragh_Matrix<VertexType, EdgeType>::GetEdgeWeight(VertexType vName1, VertexType vName2)
{
if ((!IsVertexExist(vName1)) || (!IsVertexExist(vName2)) )
{
cout<<"至少一个顶点不存在!"<<endl;
return infinity;
}
int m = GetVertexIndex(vName1);
int n = GetVertexIndex(vName2);
return edges[m][n];
}
//9.---------------插入顶点v---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::InsertVertex(const VertexType vertexname)
{
if (IsVertexExist(vertexname))
{
cout<<"该节点已存在!"<<endl;
return false;
}
if (vNum >= MAX_VEXNUM)
{
cout<<"顶点表数组已满!"<<endl;
return false;
}
vexs[vNum] = vertexname;
for(int i=0; i<vNum; ++i)
{
edges[i][vNum] = infinity;
edges[vNum][i] = infinity;
}
edges[vNum][vNum] = infinity;
++vNum;
return true;
}
//10.---------------插入弧Edge---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::InsertEdge
(const VertexType vertexname1,const VertexType vertexname2,const EdgeType edgeWeight)
{
if ((!IsVertexExist(vertexname1)) || (!IsVertexExist(vertexname2)) )
{
cout<<"至少一个顶点不存在!"<<endl;
return false;
}
int v1 = GetVertexIndex(vertexname1);
int v2 = GetVertexIndex(vertexname2);
++eNum;
edges[v1][v2] = edgeWeight;
return true;
}
//11.---------------删除顶点v及依附于该顶点的弧---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::DeleteVertex(const VertexType vertexname)
{
int delpos,i,j;
delpos = GetVertexIndex(vertexname);
if (delpos < 0)
return false;
for(i=0; i<vNum; ++i)
{
if (i == delpos)
{
if(edges[i][delpos] != infinity)
eNum--;
continue;
}
if(edges[i][delpos] != infinity)
eNum--;
if(edges[delpos][i] != infinity)
eNum--;
}
for (i=delpos+1; i<vNum; ++i)
vexs[i-1]=vexs[i];
for (i=0; i<vNum; ++i)
for (j=delpos+1; j<vNum; ++j)
{
edges[i][j-1]=edges[i][j];
}
for(i=0; i<vNum; ++i)
for(j=delpos+1; j<vNum; ++j)
edges[j-1][i]=edges[j][i];
--vNum;
return true;
}
//12.---------------删除弧---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::RemoveEdge
(const VertexType vertexname1,const VertexType vertexname2)
{
if ((!IsVertexExist(vertexname1)) || (!IsVertexExist(vertexname2)) )
{
cout<<"至少一个顶点不存在!"<<endl;
return false;
}
int v1 = GetVertexIndex(vertexname1);
int v2 = GetVertexIndex(vertexname2);
--eNum;
edges[v1][v2] = infinity;
return true;
}
//13.---------------判断弧是否存在---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::isEdgeExist
(const VertexType vertexname1,const VertexType vertexname2)
{
if ((!IsVertexExist(vertexname1)) || (!IsVertexExist(vertexname2)) )
{
cout<<"至少一个顶点不存在!"<<endl;
return false;
}
int v1 = GetVertexIndex(vertexname1);
int v2 = GetVertexIndex(vertexname2);
if(edges[v1][v2] == infinity)
return false;
else return true;
}
//14.--------------计算顶点入度---------------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::VertexID(const VertexType vertexname)
{
if (!IsVertexExist(vertexname))
{
return -1;
}
int v=GetVertexIndex(vertexname); //元素V在邻接矩阵中的行数
int ID = 0;
for (int i=0; i<vNum; ++i)
{
if (edges[i][v] != infinity) //邻接矩阵中该列的元素数即为该顶点的入度
++ID;
}
return ID;
}
//15.--------------计算顶点出度---------------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::VertexOD(const VertexType vertexname)
{
if (!IsVertexExist(vertexname))
{
return -1;
}
int v=GetVertexIndex(vertexname); //元素V在邻接矩阵中的行数
int OD = 0;
for (int i=0; i<vNum; ++i)
{
if (edges[v][i] != infinity) //邻接矩阵中该行的"元素数"即该顶点的出度
++OD;
}
return OD;
}
//16.--------------计算顶点度---------------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::VertexAD(const VertexType vertexname)
{
if (!IsVertexExist(vertexname))
{
return -1;
}
int AD = 0;
return VertexOD(vertexname)+VertexID(vertexname);
}
//17.--------------递归深度优先遍历---------------------
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::DFS(int index)
{
cout<<setw(5)<<vexs[index];
visited[index] = true;
for (int i=0; i<vNum; i++)
{
if ( (edges[index][i] != infinity ) && !visited[i])
DFS(i);
}
}
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::DFSTraverse()
{
int i;
memset(visited, false, sizeof(visited));
/*
for(i=0; i<vNum; i++)
{
visited[i] = false;
}*/
for (i=0; i<vNum; ++i)
{
if (!visited[i])
DFS(i);
}
cout<<endl;
}
//18.--------------递归广度优先遍历---------------------
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::BFS(int index)
{
int i;
int queue[MAX_VEXNUM];
int front = -1,rear = -1;
cout<<setw(5)<<vexs[index];
visited[index] = true;
queue[++rear] = index;
while(rear > front)
{
i = queue[++front];
for (int j=0; j<vNum; j++)
{
if ( (edges[i][j] != infinity) && !visited[j])
{
cout<<setw(5)<<vexs[j];
queue[++rear] = j;
visited[j] = true;
}
}
}
}
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::BFSTraverse()
{
int i;
//memset(visited, false, sizeof(visited));
for(i=0; i<vNum; i++)
{
visited[i] = false;
}
for (i=0; i<vNum; ++i)
{
if (!visited[i])
BFS(i);
}
cout<<endl;
}
图_邻接矩阵
最新推荐文章于 2023-08-27 23:38:05 发布