数据结构:图的遍历

#ifndef Digraph_hpp
#define Digraph_hpp

#include <iostream>
#include <list>
#include <vector>
#include <queue>
using namespace std;

class Digrah
{
public:
    char Data(int k) const;
    void read(istream &in);
    void display(ostream &out);
    void DepthFirstSearch(int start);
    void BreadthFirstSearch(int strat);
private:
    class VertexInfo
    {
    public:
        char data;
        list<int> adjacencyList;
    };
    vector<VertexInfo> myAdjacencyLists;
    void depthFirstSearchAux(int start, vector<bool> &unvisited);
};

inline char Digrah::Data(int k) const
{
    return myAdjacencyLists[k].data;
}

#endif /* Digraph_hpp */
#include "Digraph.hpp"

void Digrah::read(istream &in)
{
    cout << "输入 * 代表输入结束" <<endl;
    Digrah::VertexInfo vi;
    int n, vertex;
    myAdjacencyLists.push_back(vi);
    for(;;)
    {
        in >> vi.data;
        if(vi.data == '*') break;
        in >> n;
        list<int> adjList;
        for(int i = 1; i <= n; i++)
        {
            in >> vertex;
            adjList.push_back(vertex);
        }
        vi.adjacencyList = adjList;
        myAdjacencyLists.push_back(vi);
    }
}

void Digrah::display(ostream &out)
{
    out << "该图的邻接表示为:" << endl;
    for(int i = 1; i < myAdjacencyLists.size(); i++)
    {
        out << i << ":" << myAdjacencyLists[i].data << "-";
        for(list<int>::iterator it = myAdjacencyLists[i].adjacencyList.begin();
            it != myAdjacencyLists[i].adjacencyList.end(); it++)
            out << *it << "  ";
        out << endl;
    }
}

void Digrah::DepthFirstSearch(int strat)
{
    vector<bool> unvisited(myAdjacencyLists.size(), true);
    depthFirstSearchAux(strat, unvisited);
}

void Digrah::depthFirstSearchAux(int strat, vector<bool> &unvisited)
{
    cout << myAdjacencyLists[strat].data << "  ";
    unvisited[strat] = false;
    for(list<int>::iterator it = myAdjacencyLists[strat].adjacencyList.begin();
        it != myAdjacencyLists[strat].adjacencyList.end(); it++)
        if(unvisited[*it]) depthFirstSearchAux(*it, unvisited);
}

void Digrah::BreadthFirstSearch(int strat)
{
    queue<int> vertexQueue;
    vector<bool> unvisited(myAdjacencyLists.size(), true);
    cout << myAdjacencyLists[strat].data << "  ";
    unvisited[strat] = false;
    int vertex;
    vertexQueue.push(strat);
    while(!vertexQueue.empty())
    {
        vertex = vertexQueue.front();
        vertexQueue.pop();
        for(list<int>::iterator it = myAdjacencyLists[vertex].adjacencyList.begin();
            it != myAdjacencyLists[vertex].adjacencyList.end(); it++)
        {
            if(unvisited[*it])
            {
                cout << myAdjacencyLists[*it].data << "  ";
                unvisited[*it] = false;
                vertexQueue.push(*it);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41579622/article/details/81633344