DFS和BFS

来源:互联网 发布:java构造方法重载要素 编辑:程序博客网 时间:2024/06/03 18:11
#include<iostream>#include<queue>using namespace std;#define MAX 100class 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 00 0 1 0 0 0 01 1 0 1 0 0 01 0 1 0 0 0 00 0 0 0 0 0 11 0 0 0 0 0 10 0 0 0 1 1 0DFS: A C B D F G EBFS: A C D F B G E*/