#include<iostream>
#include<queue>
using namespace std;
#define MAX 100
class MGraph
{
private:
int num_vertex;//顶点数目
char array_vertex[MAX];//顶点的集合
bool visited[MAX];//顶点访问标志
int matrix_graph[MAX][MAX];//邻接矩阵
public:
//MGraph();
MGraph(int num_v,char *array_v,int (*matrix)[MAX]);
//~MGraph();
void BFS();//广度优先搜索
void DFS();//深度优先搜索
void SUB_DFS(int order);//深度优先搜索递归程序
};
MGraph::MGraph(int num_v,char *array_v,int (*matrix)[MAX])
{
num_vertex = num_v;
for(int i = 0;array_v[i]!='\0';i++)
array_vertex[i] = array_v[i];
for(int i = 0;i<num_v;i++)
{
for(int j = 0;j<num_v;j++)
{
matrix_graph[i][j] = matrix[i][j];
}
}
}
void MGraph::DFS()
{
//初始化所有节点状态为未访问
for(int i = 0;i<num_vertex;++i)
visited[i] = false;
//深度遍历各个顶点
for(int i = 0;i<num_vertex;++i)
if(!visited[i])
SUB_DFS(i);
}
void MGraph::SUB_DFS(int order)
{
cout<<array_vertex[order]<<" ";
visited[order] = true;
//查看与其相连的下一个邻接点
for(int i = 0;i<num_vertex;++i)
if(matrix_graph[order][i] == 1 && !visited[i])
SUB_DFS(i);
}
void MGraph::BFS()
{
for(int i = 0;i<num_vertex;++i)
visited[i] = false;
queue<int> que;
for(int i = 0;i<num_vertex;++i)//对每个节点做循环
{
if(!visited[i])
{
visited[i] = true;
cout<<array_vertex[i]<<" ";//输出该节点
que.push(i);//将该节点入队列
while(!que.empty())
{
int order = que.front();//队首元素
que.pop();
for(int j = 0;j<num_vertex;++j)
{
//判断其他顶点若与当前节点存在边且未访问
if(matrix_graph[order][j] == 1 && !visited[j])
{
visited[j] = true;
cout<<array_vertex[j]<<" ";
que.push(j);
}
}
}
}
}
cout<<endl;
}
int main()
{
int num_v = 0;
char array_v[MAX] = {0};
cout<<"请输入顶点数目:";
cin>>num_v;
cout<<"请输入顶点的集合:";
char ch;
while(cin>>ch)
{
static int num = 0;
if(!((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')))
break;
array_v[num++] = ch;
}
cout<<"请输入邻接矩阵:"<<endl;
int matrix_g[MAX][MAX];
for(int i = 0;i<num_v;i++)
{
for(int j = 0;j<num_v;j++)
{
cin>>matrix_g[i][j];
}
}
MGraph G(num_v,array_v,matrix_g);
cout<<"深度优先搜索:";
G.DFS();
cout<<endl;
cout<<"广度优先搜索:";
G.BFS();
return 0;
}
// 测试用例
/*
Martix Graph:
0 0 1 1 0 1 0
0 0 1 0 0 0 0
1 1 0 1 0 0 0
1 0 1 0 0 0 0
0 0 0 0 0 0 1
1 0 0 0 0 0 1
0 0 0 0 1 1 0
DFS: A C B D F G E
BFS: A C D F B G E
*/