#include <iostream>
#include<string.h>
#include "stdio.h"
using namespace std;
//采用邻接矩阵表示无向图
//1.完成图的创建
//2.图的深度优先遍历
//3.图的广度优先遍历操作
//其中图的顶点信息是char,图中顶点序号按字符顺序排列
const int MaxSize = 10;
int visited[MaxSize] = { 0 };
class MGraph
{
public:
MGraph(char a[], int n, int e); //储存顶点的数组,顶点个数,边的个数
~MGraph() {}; //静态储存分配,自动释放内存单元,析构为空
void DFTraverse(int v);
void BFTraverse(int v);
void getVertex(); //输出顶点信息
void getN(int n);//输出n行n列的邻接矩阵
private:
char vertex[MaxSize]; //存放顶点的数组
int edge[MaxSize][MaxSize]; //存放边的数组
int vertexNum, edgeNum; //图的顶点数和边数
};
void MGraph::getN(int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (edge[i][j] == 1)
{
cout << "1"<<" ";
}
if (edge[i][j] == 0)
{
cout << "0"<<" ";
}
}
cout << endl;
}
}
MGraph :: MGraph(char a[],int n,int e)
{
int i, j, k;
vertexNum = n;
edgeNum = e;
for (i = 0; i < vertexNum; i++)
{
vertex[i] = a[i];
}
for (i = 0; i < vertexNum; i++) //初始化n行n列的矩阵,是一个二维数组,并且n=vertexNum
{
for (j = 0; j < vertexNum; j++)
{
edge[i][j] = 0;
}
}
for (k = 0; k < edgeNum; k++)
{
cin >> i >> j;
edge[i][j] = 1;
edge[j][i] = 1;
}
}
//深度优先遍历
void MGraph::DFTraverse(int v)
{
cout << vertex[v]<<" ";
visited[v] = 1;
for (int j = 0; j < vertexNum; j++)
{
if (edge[v][j] == 1 && visited[j] == 0)
{
DFTraverse(j);
}
}
}
//广度优先遍历
void MGraph::BFTraverse(int v)
{
int j, Q[MaxSize];
int front = -1, rear = -1;
cout << vertex[v] << "";
visited[v] = 1;
Q[++rear] = v; //被访问的顶点进入队列
while (front != rear) //队列不为空,这里为了方便采用顺序存储并没有考虑溢出的问题
{
v = Q[++front];
for (j = 0; j < vertexNum; j++)
{
if (edge[v][j] == 1 && visited[j] == 0)
{
cout << vertex[j] << " ";
visited[j] = 1;
Q[++rear] = j;
}
}
}
}
void MGraph::getVertex() //输出顶点信息
{
for (int i = 0; i < vertexNum; i++)
{
cout << vertex[i] << " ";
}
cout << endl;
}
int main()
{
//输出要求:
//1.图的顶点信息
//2.邻接矩阵,假如图中有n个顶点,则输出形式为n行n列的邻接矩阵
//3.从图的第一个顶点开始进行深度优先遍历的序列,中间以空格隔开,输出完毕换行
//4.从图的第一个顶点开始进行广度优先遍历的序列,中间以空格隔开,输出完毕换行
char a[MaxSize];
char c;
int n, e;
int i;
cin >> n >> e;
for (i = 0; i < n; i++)
{
cin >> c;
a[i] = c;
}
MGraph MG(a, n, e); //建立一个邻接矩阵
MG.getVertex();
MG.getN(n);
//初始化用作标记的数组
for (i = 0; i < MaxSize; i++)
{
visited[i] = 0;
}
//cout << "深度:" << endl;
for (i = 0; i < n; i++)
{
if (visited[i] == 0)
{
MG.DFTraverse(i);
}
}
cout << endl;
for (i = 0; i < MaxSize; i++)
{
visited[i] = 0;
}
//cout << "广度:" << endl;
for (i = 0; i < n; i++) {
if (visited[i] == 0) {
MG.BFTraverse(i); //这里的i是考虑了有无连接点的情况
}
}
return 0;
}