图_邻接矩阵

//#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值