#include<iostream>
using namespace std;
const int MaxSize = 10;
int visited[MaxSize] = { 0 };
//顶点表结点和边表结点的结构体定义
//边表结点
struct EdgeNode
{
int adjvex;
EdgeNode* next;
};
//定点表结点
struct VertexNode
{
char vertex;
EdgeNode* firstEdge;
};
class ALGraph
{
public:
ALGraph(char a[], int n, int e);
~ALGraph();
void DFTraverse(int v);
void BFTraverse(int v);
void getVertex();
void getNum();
private:
VertexNode adjlist[MaxSize];
int vertexNum, edgeNum;
};
//邻接表的实现
//1.构造函数
ALGraph::ALGraph(char a[],int n,int e) //n代表顶点个数,e代表边的个数
{
int i, j, k;
EdgeNode* s = NULL;
vertexNum = n;
edgeNum = e;
for (i = 0; i < vertexNum; i++) {
adjlist[i].vertex = a[i];
adjlist[i].firstEdge = NULL;
}
for (k = 0; k < edgeNum; k++) {
cin >> i >> j;
s = new EdgeNode;
s->adjvex = j;
s->next = adjlist[i].firstEdge;
adjlist[i].firstEdge = s;
}
}
//2.析构函数
ALGraph::~ALGraph()
{
EdgeNode* p = NULL, * q = NULL;
for (int i = 0; i < vertexNum; i++) {
p = q = adjlist[i].firstEdge;
while (p != NULL) {
p = p->next;
delete q;
q = p;
}
}
}
//3.深度优先遍历
void ALGraph::DFTraverse(int v)
{
int j;
EdgeNode* p = NULL; //工作指针p
cout << adjlist[v].vertex << " ";
visited[v] = 1;
p = adjlist[v].firstEdge; //工作指针指向顶点v的边表
while (p != NULL) {
j = p->adjvex;
if (visited[j] == 0) {
DFTraverse(j);
}
p = p->next;
}
}
//4.深度优先遍历
void ALGraph::BFTraverse(int v)
{
int w, j, Q[MaxSize];
int front = -1, rear = -1;
EdgeNode* p = NULL;
cout << adjlist[v].vertex << " ";
visited[v] = 1;
Q[++rear] = v;
while (front != rear) {
w = Q[++front];
p = adjlist[w].firstEdge;
while (p != NULL) {
j = p->adjvex;
if (visited[j] == 0) {
cout << adjlist[j].vertex << " ";
visited[j] = 1;
Q[++rear] = j;
}
p = p->next;
}
}
}
void ALGraph::getVertex()
{
for (int i = 0; i < vertexNum; i++) {
cout << adjlist[i].vertex << " ";
}
}
//输出邻接表
void ALGraph::getNum()
{
for (int i = 0; i < vertexNum; i++)
{
visited[i] = 0;
}
EdgeNode* p = NULL;
for (int i = 0; i < vertexNum; i++) {
cout << adjlist[i].vertex << " ";
p = adjlist[i].firstEdge;
while (p != NULL) {
cout << p->adjvex << " ";
p = p->next;
}
cout << endl;
}
}
int main()
{
char ch[MaxSize] = {};
int i;
int n, e; //顶点个数、边的个数
char c;
//输入描述:
//1.第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数
cin >> n >> e;
//2.第二行输入各顶点的信息,即输入每个顶点字符
for (i = 0; i < n; i++) {
cin >> c;
ch[i] = c;
}
//3.第三行开始输入每条边,每条边的形式为两个顶点的序号,中间以空格隔开,输入完一条边换行
//调用邻接表的构造函数
ALGraph alg(ch, n, e);
//输出顶点信息
alg.getVertex();
cout << endl;
alg.getNum();
//初始化标记数组
for (i = 0; i < MaxSize; i++) {
visited[i] = 0;
}
for (i = 0; i < n; i++) {
if (visited[i] == 0) {
alg.DFTraverse(i);
}
}
cout << endl;
for (i = 0; i < MaxSize; i++) {
visited[i] = 0;
}
for (i = 0; i < n; i++) {
if (visited[i] == 0) {
alg.BFTraverse(i);
}
}
return 0;
}