DFS和BFS

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章