在网上看到的这段程序是用邻接矩阵做的,有时间我会在后面用邻接链表尝试一下。
代码来自 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;
}