图的遍历

来源:互联网 发布:软件流量是什么 编辑:程序博客网 时间:2024/05/29 09:25
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <stdio.h>
const int Max = 26;


using namespace std;


class Graph{
private:
    struct VertexNode{//节点信息
        bool isVisited;
        string data;
        vector<int> vecNode;
        VertexNode():isVisited(false) {}
    };
    struct Edge{
        int beginNode;
        int endNode;
    };


    int VertexNum;//节点个数;
    int EdgeNum;//边的个数;
    vector<VertexNode> vecVertex;//存储节点的容器
public:
    Graph(int v):VertexNum(v),EdgeNum(0){//初始化
        char tmp[Max];
        VertexNode node;
        for(int i =0;i<v;i++){
            sprintf(tmp,"v%d",i+1);
            node.data = tmp;
            vecVertex.push_back(node);
        }
    }
    void insertEdge(int b,int e){
        Edge edge;
        edge.beginNode = b;
        edge.endNode = e;
        vecVertex.at(b).vecNode.push_back(e);
        EdgeNum++;
    }
    void showGraph(){
        cout<<"show Graph:\n";
        for(int i =0;i<VertexNum;i++){
            cout<<"node "<<i<<"("<<vecVertex.at(i).data<<")";
            for(int j =0;j<vecVertex.at(i).vecNode.size();j++)
                cout<<"->"<<vecVertex.at(i).vecNode.at(j);
             cout<<endl;
        }
    }


    void depthFirstSearch(){
        cout<<"depthFirstSearch: \n";
        for(int i =0;i<VertexNum;i++){
            if(!vecVertex.at(i).isVisited)
                depthFirstSearch(i);
        }
    }
    void depthFirstSearch(int v){
        int iAdjacent = 0;
        VertexNode node = vecVertex.at(v);
        vecVertex.at(v).isVisited = true;
        cout<<node.data<<endl;
        for(int i =0;i<node.vecNode.size();i++){
            iAdjacent = node.vecNode.at(i);
            if(!vecVertex.at(iAdjacent).isVisited)
                depthFirstSearch(iAdjacent);
        }
    }


    void breadFirstSearch(){
        int count = 0;
        queue<int> bfs_queue;
        cout<<"breadFirstSearch:\n";
        for(int i = 0;i<VertexNum;i++){
            vecVertex.at(i).isVisited = false;
        }
        for(int i =0;i<VertexNum;i++){
            if(!vecVertex.at(i).isVisited){
                vecVertex.at(i).isVisited = true;
                cout<<vecVertex.at(i).data<<endl;
            }
            bfs_queue.push(i);
            while(!bfs_queue.empty()){
                VertexNode node = vecVertex.at(bfs_queue.front());
                bfs_queue.pop();
                for(int i =0;i<node.vecNode.size();i++){
                    if(!(vecVertex.at(node.vecNode.at(i)).isVisited)){
                        vecVertex.at(node.vecNode.at(i)).isVisited = true;
                        cout<<vecVertex.at(node.vecNode.at(i)).data<<endl;
                        bfs_queue.push(node.vecNode.at(i));
                    }
                }
            }
        }
    }
};



int main()
{
    Graph graph(4);
    graph.insertEdge(graph.makeEdge(0,3));
    graph.insertEdge(graph.makeEdge(0,2));
    graph.insertEdge(graph.makeEdge(1,0));
    graph.insertEdge(graph.makeEdge(3,1));
    graph.insertEdge(graph.makeEdge(3,0));
    graph.showGraph();
    graph.depthFirstSearch();
    graph.breadFirstSearch();
    cin.get();
    cout << "Hello world!" << endl;
    return 0;

}

//转自http://blog.csdn.net/wobuaishangdiao/article/details/8044916


//转自http://blog.csdn.net/wobuaishangdiao/article/details/8044916
//转自http://blog.csdn.net/wobuaishangdiao/article/details/8044916

0 0
原创粉丝点击