#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
*/