图的深度遍历和广度遍历是数据结构的基础,但是大一的时候并没有好好的实现它。现在拾遗也为时不晚。
深度遍历的思想是递归,找到不能找再换未被访问的顶点。
广度遍历的思想是将一个顶点所有邻接顶点访问完,再找未被访问的顶点继续广。
这些概念随便找一个数据结构的书都有,就不废话了。
由于习惯了写类的强迫症,这次我也写了一个类。边的权值有设计但这次就随便设计了,为以后复现prim和Dij算法方便。
自己找了个样例实现了一下:
图是百度百科找的,侵删。
深度遍历结果:
广度遍历结果:
源代码:
#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();
}