#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);
}
}
}
}