【数据结构】 图的邻接矩阵

在图的存储方法中,邻接矩阵通过数组对图的信息进行存储。

基本思路

使用邻接矩阵前,需要开一个一维数组数组,以存储各个顶点的数据(数组的编号与邻接矩阵中顶点的编号一一对应);同时,还需要一个标记顶点是否被访问的一维数组,用来表示图中顶点是否被访问。【其中,标记顶点是否被访问的数组使用全局变量】

邻接矩阵为n*n方阵(二维数组),用来表示图中顶点间的连通关系(两顶点连通,数组值为1;两顶点不连通,数组值为0)。因此邻接矩阵edge数组的大小取决于图中顶点的数量。

邻接矩阵构造前,需要对标记数组、邻接矩阵edge数组分别进行初始化(赋值为0)。

构造邻接矩阵时,需要对应图中每条边的两端点,对邻接矩阵edge进行赋值(循环实现edge赋值时,循环变量的终止条件为边长)。

代码实现

本文邻接矩阵存储使用C++面向对象的方法实现。邻接矩阵本质上是数组,为静态存储,所以类中无需手动写析构函数,使用默认析构函数即可!

在类定义前,需要对数组长度进行统一分配

const int MaxSize=100;

类的声明

class MGraph{
public:
	MGraph(char a[],int n,int e);
	~MGraph(){};
	void dfs(int v);
	void bfs(int v);
private:
	char vertx[MaxSize];						//数组存储顶点数据
	int edge[MaxSize][MaxSize];					//邻接矩阵 
	int vertxNum,EdgeNum;		 				//记录顶点和边的数量 
};

类功能的实现

构造函数

以无向图为例,建立邻接矩阵。

构造函数所需参数分别为:顶点数据、定点数、边数。

构造过程及代码如下:

MGraph::MGraph(char a[],int n,int e){
	vertxNum=n,EdgeNum=e;						//1.顶点数、边数传入 
	int i,j,k;		
	for(i=0;i>i>>j;								//4.输入邻接点编号,建图
		edge[i][j]=1;edge[j][i]=1; 
	}
}

图的遍历

图的遍历方式有两种,分别是DFS(深度优先)和BFS(广度优先),详情可以看笔者曾经发布的文章。在此不再赘述。

DFS算法过程及代码
void MGraph::dfs(int v){

	cout<
BFS算法过程及代码
void MGraph::bfs(int v){
	//bfs功能需要队列实现
	int rear,front,Q[MaxSize];
	front=rear=-1;								//1.建队列 
	int i,k;
	cout<

完整代码

【数据结构】 图的邻接矩阵_第1张图片
以无向图为例,测试的边为:(0 1) (0 2) (0 3) (0 4) (1 2) (2 4) 。

#include
using namespace std;
const int MaxSize=100;
int vis[MaxSize];
class MGraph{
public:
	MGraph(char a[],int n,int e);
	~MGraph(){};
	void dfs(int v);
	void bfs(int v);
private:
	char vertx[MaxSize];						//数组存储顶点数据
	int edge[MaxSize][MaxSize];					//邻接矩阵 
	int vertxNum,EdgeNum;		 				//记录顶点和边的数量 
};

MGraph::MGraph(char a[],int n,int e){
	vertxNum=n,EdgeNum=e;						//顶点数、边数传入 
	int i,j,k;		
	for(i=0;i>i>>j;		//输入邻接点编号,更新邻接矩阵
		edge[i][j]=1;edge[j][i]=1; 
	}
}

void MGraph::dfs(int v){

	cout<>n>>e;
	cout<<"输入顶点数据:"; 
	char vt[MaxSize];
	for(int i=0;i>vt[i];
	MGraph Gra(vt,n,e);			//建图
	
	cout<<"DFS:";
	for(int j=0;j

你可能感兴趣的:(C++,数据结构,图论,算法)