图的邻接矩阵表示及其基本操作


文章目录

  • 图的邻接矩阵表示及其基本操作
  • 1.邻接矩阵
  • 2.图的邻接矩阵存储结构类型声明
  • 3.基于邻接矩阵表示的无向图的创建
  • 4.基于邻接矩阵的无向图的其它操作


1.邻接矩阵

表示图的一种简单方式是使用二维数组,称为邻接矩阵表示法。图中的每条边(v, w),设置A[v][w]=1;若不存在边(v, w),则A[v][w] = 0;如果边上带权值,那么可以设置A[v][w]等于该权值,同时使用一个很大或者很小的权值来表示不存在的边。如图,展示了无向图、有向图、有向网和它们的邻接矩阵。

定义邻接关系建立权重矩阵R语言 邻接矩阵权值如何设置_无向图


邻接矩阵是一种顺序结构,从邻接矩阵的行数或者列数可知图的顶点数。无向图的邻接矩阵总是对称的,但有向图的邻接矩阵不一定对称。

2.图的邻接矩阵存储结构类型声明

#define MAX_V 20    //最大顶点数
#define OK 1
#define ERROR 0
typedef int ElemType, Status;
typedef int GraphKind;    //图的种类标志,无向图0,有向图1,无向网2,有向网3

class MGraph {
private:
	int arcs[MAX_V][MAX_V];    //邻接矩阵,存放的是边的信息
	int vexnum, arcnum;    //图包含的顶点数与边的个数
	ElemType vexs[MAX_V];    //存储顶点的值
	GraphKind type;    //图的种类标志,分为无向图0,有向图1,无向网2,有向网3
public:
	Status CreateGraph();    //基于邻接矩阵的无向图的创建
	Status DestroyGraph();    //基于邻接矩阵的无向图的销毁
	ElemType GetVex(int v);    //返回编号为v的顶点信息
	Status InsertVex();    //插入顶点
	Status InsertArc(int v, int w);    //插入边
	Status DeleteVex(int v);    //删除顶点
	Status DeleteArc(int v, int w);    //删除边
	Status Print();    //打印邻接矩阵
};

3.基于邻接矩阵表示的无向图的创建

//基于邻接矩阵的无向图的创建
Status MGraph::CreateGraph() {
	int v, e, i, j;
	int v1, v2;
	cin >> v >> e;
	vexnum = v;
	arcnum = e;
	for (i = 0; i < vexnum; i++)
		cin >> vexs[i];
	for (i = 0; i < vexnum; i++)    //邻接矩阵初始化
		for (j = 0; j < vexnum; j++)
			arcs[i][j] = 0;

	//输入邻接矩阵
	for (i = 0; i < arcnum; i++) {
		cin >> v1 >> v2;
		arcs[v1][v2] = 1;
		arcs[v2][v1] = 1;
	}
	return OK;
}

4.基于邻接矩阵的无向图的其它操作

//基于邻接矩阵的无向图的销毁
Status MGraph::DestroyGraph() {
	for (int i = 0; i < vexnum; i++)
		for (int j = 0; j < vexnum; j++)
			arcs[i][j] = 0;
	vexnum = 0;
	arcnum = 0;
	return OK;
}

//返回编号为v的顶点的值
ElemType MGraph::GetVex(int v) {
	if (v >= 0 && v < vexnum)
		return vexs[v];
	else
		return ERROR;
}

//插入一个顶点
Status MGraph::InsertVex() {
	cin >> vexs[vexnum];
	vexnum++;
	int i, j;
	for (int n = 0; n < vexnum; n++) {
		arcs[vexnum-1][n] = 0;
		arcs[n][vexnum-1] = 0;
	}
	while (true) {
		cin >> i >> j;
		if (i == -1)
			break;
		arcs[i][j] = 1;
		arcs[j][i] = 1;
	}
	return OK;
}

//插入一条边
Status MGraph::InsertArc(int v, int w) {
	arcs[v][w] = 1;
	arcs[w][v] = 1;
	return OK;
}

//删除一个顶点
Status MGraph::DeleteVex(int v) {
	int i, j; 
	for (i = v; i < vexnum - 1; i++) {
		for (j = 0; j < vexnum; j++) {
			arcs[i][j] = arcs[i + 1][j];
			arcs[j][i] = arcs[i][j];
		}
	}
	for (i = v; i < vexnum - 1; i++)
		vexs[i] = vexs[i + 1];
	vexnum--;
	return OK;
}

//删除一条边
Status MGraph::DeleteArc(int v, int w) {
	arcs[v][w] = 0;
	arcs[w][v] = 0;
	return OK;
}

//打印邻接矩阵
Status MGraph::Print() {
	int i, j;
	for (i = 0; i < vexnum; i++) {
		for (j = 0; j < vexnum; j++) {
			cout << arcs[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
	return OK;
}