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

来源:互联网 发布:java类的主方法是啥 编辑:程序博客网 时间:2024/05/20 23:30

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

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

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

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

    由于习惯了写类的强迫症,这次我也写了一个类。边的权值有设计但这次就随便设计了,为以后复现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();}


   

阅读全文
0 0
原创粉丝点击