【数据结构】拾遗(一):图的邻接矩阵创建以及其深广度遍历C++实现

    图的深度遍历和广度遍历是数据结构的基础,但是大一的时候并没有好好的实现它。现在拾遗也为时不晚。

    深度遍历的思想是递归,找到不能找再换未被访问的顶点。

    广度遍历的思想是将一个顶点所有邻接顶点访问完,再找未被访问的顶点继续广。

    这些概念随便找一个数据结构的书都有,就不废话了。

    由于习惯了写类的强迫症,这次我也写了一个类。边的权值有设计但这次就随便设计了,为以后复现prim和Dij算法方便。

    自己找了个样例实现了一下:

   《【数据结构】拾遗(一):图的邻接矩阵创建以及其深广度遍历C++实现》

        图是百度百科找的,侵删。

       深度遍历结果:

        《【数据结构】拾遗(一):图的邻接矩阵创建以及其深广度遍历C++实现》

     广度遍历结果:

     《【数据结构】拾遗(一):图的邻接矩阵创建以及其深广度遍历C++实现》

    源代码:

#include<iostream>
#include<queue>

using namespace std;


class Map{
private:
	//动态顶点数目和动态边
	int VertexNum, EdgesNum;
	int *Vertex;
	int **Edges;
	bool *visited;
public:
	Map(int Vertex_Num,int Edges_Num, bool flag,int *message);
	void outputMessage();
	void BFSfunction(int i);
	void BFSTraverse();
	void DFSfunction(int i);
	void DFSTraverse();
	void cleanVisited();
};

//构造函数
Map::Map(int Vertex_Num, int Edges_Num, bool flag ,int * message)
{
	//边顶动态初始化
	VertexNum = Vertex_Num;
	EdgesNum = Edges_Num;
	Vertex = new int[Vertex_Num];
	Edges = new int*[Vertex_Num];
	visited = new bool[Vertex_Num];
	for (int i = 0; i < Vertex_Num; i++)
	{
		Edges[i] = new int[Vertex_Num];
	}

	//清零
	for (int i = 0; i < Vertex_Num; i++)
	{
		visited[i] = false;
		for (int j = 0; j < Vertex_Num; j++)
		{
			//-1为最大值
			Edges[i][j] = -1;

		}	
	}

	//赋权值
	int c = 0;
	for (int count = 0; count < Edges_Num; count++)
	{
		Edges[message[c]][message[c + 1]] = message[c + 2];
		if(flag)//无向图
			Edges[message[c + 1]][message[c]] = message[c + 2];
		c = c + 3;
	}

}


//测试输入的测试函数
void Map::outputMessage()
{
	cout << Edges[1][2] << endl;
}

//广度遍历
void Map::BFSfunction(int i)
{
	queue<int> Q;
	visited[i] = true;

	cout << i << " ";
	Q.push(i);
	while (!Q.empty())
	{
		Q.pop();
		for (int j = 0; j < VertexNum; j++)
		{
			if (Edges[i][j] != -1 && !visited[j])
			{
				cout << j << " ";
				visited[j] = true;
				Q.push(j);
			}
		}
	}
}

void Map::BFSTraverse()
{
	cleanVisited();
	for (int i = 0; i < VertexNum; i++)
	{
		if (!visited[i])
			BFSfunction(i);
	}
	cout << endl;
}



//深度遍历递归
void Map::DFSfunction(int i)
{
	visited[i] = true;
	cout << i << " ";
	for (int j = 0; j < VertexNum; j++)
	{
		if (Edges[i][j] != -1 && !visited[j])
		{
			DFSfunction(j);
		}
	}

}

void Map::DFSTraverse()
{
	cleanVisited();
	for (int i = 0; i < VertexNum; i++)
	{
		if (!visited[i])
			DFSfunction(i);
	}
	cout << endl;
}

//访问设置归零
void Map::cleanVisited()
{
	for (int i = 0; i < VertexNum; i++)
	{
		visited[i] = false;
	}
}


//主函数
void main()
{
	int vertexnum = 6;
	int EdgesNum = 9;
	//每三个为一组:前2个为顶点下标,3位权值。
	int message[9*3] = {  0,1,1, 0,3,1,
						  1,2,1, 5,0,1,
						  2,0,1, 5,4,1,
						  2,5,1, 4,3,1,
						  3,2,1
						};
	//flag true表示无向图,false表示有向图
	bool flag = false;
	Map m(vertexnum, EdgesNum, flag, message);
	m.BFSTraverse();
	//m.DFSTraverse();
}

   

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/qq_31548387/article/details/75204028
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞