您的位置:首页 > 其它

图的邻接矩阵表示及插入删除等操作

2017-05-19 16:41 309 查看
//  graphmtx.h
#pragma once
#include<iostream>
using namespace std;

#define DEFAULT_VERTICES_SIZE  10  //默认最大顶点数

template< class T,class E>
class GraphMtx
{
public:
GraphMtx( int sz=DEFAULT_VERTICES_SIZE)
{
MaxVertices=sz>DEFAULT_VERTICES_SIZE ? sz : DEFAULT_VERTICES_SIZE;
VerticesList=new T[MaxVertices];
for(int i=0;i<MaxVertices;++i)
{
VerticesList[i]='#';
}
Edge=new E*[MaxVertices];  //开辟数组空间
for(int i=0;i<MaxVertices;++i)
{
Edge[i]=new E[MaxVertices];
}
for(int i=0;i<MaxVertices;++i)
{
for(int j=0;j<MaxVertices;++j)
{
Edge[i][j]=0;  //边为0
}
}
numVertices=numEdges=0; //初始化一个空图
}
public:
bool InsertVertex(T v)  //插入顶点
{
if(numVertices>=MaxVertices)
return false;
VerticesList[numVertices++]=v;
return true;
}
bool InsertEdge(T vertex1,T vertex2)  //插入边
{
int v1=getPosVertex(vertex1);
int v2=getPosVertex(vertex2);
if(v1==-1||v2==-1)
return false;
Edge[v1][v2]=Edge[v2][v1]=1;
numEdges++;    //边的个数增加
return true;
}
void ShowGraph()const
{
cout<<"  ";
for(int i=0;i<numVertices;++i)
cout<<VerticesList[i]<<" ";
cout<<endl;
for(int i=0;i<numVertices;++i)
{
cout<<VerticesList[i]<<" ";
for(int j=0;j<numVertices;++j)
{
cout<<Edge[i][j]<<" ";
}
cout<<endl;
}
}
int getPosVertex(T vertex)const  //获取顶点所在位置
{
for(int i=0;i<numVertices;++i)
{
if(VerticesList[i]==vertex)
return i;
}
return -1;
}
public:
int NumberOfVertex()const  //返回当前顶点的个数
{
return numVertices;
}
int NumberOfEdge()const     //返回当前边数
{
return numEdges;
}
private:
int MaxVertices; //最大顶点个数
int numVertices;  //当前顶点个数
int numEdges;   //当前边的个数
T *VerticesList;  //顶点的存储空间
E **Edge;   //边的存储空间

public:
int getFirstNeighber(T v)const;    //获取邻接顶点
int getNextNeighber(T v1,T v2)const;  //获取下一个邻接顶点
bool RemoveVertex(T vertex) //删去顶点vertex和所有与它相关联的边
{
int v=getPosVertex(vertex);
if(v < 0 ||v >= numVertices)  //v不在图中时,不删除
return false;
if(numVertices == 1) //只剩一个顶点 不删除
return false;
int i,j;
VerticesList[v] = VerticesList[numVertices-1]; //顶点表中删除该结点
for(i = 0;i<numVertices;i++)  //减去与v相关联边数
if(Edge[i][v]==1)
numEdges--;
for(i = 0;i<numVertices;i++)  //用最后一列填补第v列
Edge[i][v] = Edge[i][numVertices-1];
numVertices--;  //顶点数减1
for(j = 0;j<numVertices;j++)
Edge[v][j] = Edge[numVertices][j]; //用最后一行填补第v行
return true;
}
bool RemoveEdge(T vertex1,T vertex2)  //在图中删去边(v1,v2)
{
int v1=getPosVertex(vertex1);
int v2=getPosVertex(vertex2);
if(v1==-1||v2==-1)
return false;
if(Edge[v2]==0)
return false;
Edge[v1][v2]=Edge[v2][v1]=0;
numEdges --;
return true;
}
};
template<class T,class E>
int GraphMtx<T,E>::getFirstNeighber (T v)const     //顶点位置为v
{
int p = getPosVertex(v);
if(p!=-1)
{
for(int i=0;i<numVertices;i++)
if(Edge[p][i]==1)
return i;
}
return -1;
}
template<class T,class E>
int GraphMtx<T,E>::getNextNeighber (T vertex1,T vertex2)const   //顶点v1的某邻接顶点v2的下一个邻接顶点
{
int v1=getPosVertex(vertex1);
int v2=getPosVertex(vertex2);
if(v1!=-1&&v2!=-1)
{
for(int i=v2+1;i<numVertices;i++)
if(Edge[v1][i]==1)
return i;
}
return -1;
}
//......test.cpp
#include"graphmtx.h"
/*
图:是由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构:Graph = (V,E);
其中,顶点集合V = {x|x属于某个数据对象集}是有穷非空集合,E = {(x,y)|x,y属于V}或E={<x,y>|x,y属于V&&PATH(x,y)}是顶点间关系的有穷集合,也叫做边集合。path(x,y)表示从顶点x到顶点y的一条单向通路,它是有方向的。
图的邻接矩阵表示:首先将所有顶点的信息组织成一个顶点表,然后利用一个矩阵来表示各顶点之间的邻接关系,称为邻接矩阵。

*/
void main()
{
GraphMtx<char,int>gm;
gm.InsertVertex ('A');
gm.InsertVertex ('B');
gm.InsertVertex ('C');
gm.InsertVertex ('D');
gm.InsertEdge ('A','B');
gm.InsertEdge ('B','C');
gm.InsertEdge ('A','D');
gm.InsertEdge ('C','D');
gm.InsertEdge ('B','D');
gm.ShowGraph ();
int num = gm.getFirstNeighber('C');
printf("%d\n",num);
num = gm.getNextNeighber ('B','C');
printf("%d\n",num);
num = gm.NumberOfVertex ();
printf("%d\n",num);
num = gm.NumberOfEdge ();
printf("%d\n",num);

//gm.RemoveVertex ('C');  //删除某一个顶点
//gm.ShowGraph ();
gm.RemoveEdge ('B','D');
gm.ShowGraph ();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息