在网上看到的这段程序是用邻接矩阵做的,有时间我会在后面用邻接链表尝试一下。
代码来自 http://blog.csdn.net/qq_22335577/article/details/40684573
不过这代码写得并不是很完美,还有优化的可能,对代码做了一些改动,在原思路不变的基础上。也做了一些注释,更方便阅读。
#include<iostream> using namespace std; typedef char vertextype; typedef int edgetype; #define maxvex 100 #define infinity 1000 #include<queue> int visited[100]; class MGraph{ public: vertextype vexs[maxvex]; //这些数据还是用private比较好,封装起来 edgetype arc[maxvex][maxvex]; int numvertexs,numedges;//图的顶点数目和图的边的数目 MGraph(const int &v,const int &e):numvertexs(v),numedges(e){} //这个numedge完全没有用到啊??? void creategraph();//创建图结构 void displaygraph();//显示图的结构 void DFS(int i);//深度优先遍历的子函数 void DFSTraverse(); void MGraph::BFS(i); void BFSTraverse();//定义广度遍历算法 }; void MGraph::creategraph() //初始化顶点和邻接矩阵 { cout<<"please inpit vertex type:"<<numvertexs<<endl; for(int i=0;i<numvertexs;++i) { cin>>vexs[i]; } cin.clear(); cout<<"please initiate the matrix:"<<numvertexs<<"*"<<numvertexs<<endl; for(int i=0;i<numvertexs;++i) { for(int j=0;j<numvertexs;++j) { cin>>arc[i][j]; } } } void MGraph::displaygraph() //显示图 { cout<<"print the vertex:"<<endl; for(int i=0;i<numvertexs;++i) { cout<<vexs[i]<<" "; } cout<<endl; for(int i=0;i<numvertexs;++i) { for(int j=0;j<numvertexs;++j) { cout<<arc[i][j]<<'\t'; } cout<<endl; } } //下面定义深度优先的函数 void MGraph::DFS(int i) //这里的i为顶点 { int j; visited[i]=true; cout<<"DFS info:"<<vexs[i]<<endl; for(j=0;j<numvertexs;++j) { if(arc[i][j]==1&&!visited[j]) //有边而且未被访问过,递归 DFS(j); } } void MGraph::DFSTraverse() //深度遍历 { int i; for(i=0;i<numvertexs;++i) { visited[i]=0; //初始化都未访问 } for(i=0;i<numvertexs;++i) { if(!visited[i]) //这句是有必要的,因为可能在DFS的时候,已经访问过了 DFS(i); } } void MGraph::BFS(i) //对一个顶点进行BFS { if(!visited[i]) //同样这句也是有必要的,确保没有被访问过 { visited[i]=true; cout<<"BFS info:"<<vexs[i]<<endl; q.push(i); while(!q.empty()) //queue不为空,即遍历没有完成 { int k; k=q.front(); //获取队首元素 q.pop(); //出队列 for(j=0;j<numvertexs;++j) { if(arc[i][j]==1&&!visited[j]) //判断是否右边,是否遍历过 { visited[j]=true; cout<<"BFS info:"<<vexs[i]<<endl; q.push(j); //入队 } } } } } void MGraph::BFSTraverse() //广度遍历 { int i,j; queue<int> q; //设置queue,存储遍历到的顶点,通过入栈出栈遍历 for(i=0;i<numvertexs;++i) //初始化所有的都未访问 visited[numvertexs]=0; for(i=0;i<numvertexs;++i) { BFS(i); //调用了上面的子函数 } } int main() { MGraph G(4,5); G.creategraph(); G.displaygraph(); G.DFSTraverse(); G.BFSTraverse(); system("pause"); return 0; }