图的深度优先遍历(DFS)
从图中某个顶点V出发,访问此顶点,然后从V的未被访问的邻接点出发深度优先遍历图,直至图中所有和V有路径想通的顶点都被访问到。如果对于非连通的图,只需分别对他连通的子图进行深度优先遍历。 在这我用邻接矩阵这个存储结构来表示图。
假如我存储{A B C D E F G H I},按照上图构造图。输入顶点和边的关系就行了,右图是边的关系
有了这两幅图就容易构造图了,搜索就是上文提到的,这里不再赘述了,看代码注释吧:
#include "iostream"
using namespace std;
typedef char VertexType; //顶点类型
#define MAXVER 50 //最大顶点个数
typedef struct _Graph
{
VertexType Vertexts[MAXVER]; //顶点信息
int arc[MAXVER][MAXVER]; //邻接矩阵
int numvertexs; //顶点个数
int numedge; //边的个数
}MGraph;
void CreateGraph(MGraph&Graph)
{
cout<<"input vertex"<<endl;
for(int i=0;i<MAXVER;i++)
Graph.Vertexts[i]=0;
for(int i=0;i<9;i++)
{
char ch;
cin>>ch;
Graph.Vertexts[i]=ch; //初始化顶点
}
Graph.numvertexs=9;
cout<<"input Edge relative i j "<<endl;
for(int q=0;q<15;q++)
{
int i,j;
cin>>i>>j;
Graph.arc[i][j]=Graph.arc[j][i]=1; //输入边的关系,无向图邻接矩阵式对称的
}
Graph.numedge=15;
}
void DFS(MGraph&g,int i,int*visted)
{
visted[i]=true;
cout<<g.Vertexts[i]<<endl; //输出顶点
for(int j=0;j<g.numvertexs;j++)
if(g.arc[i][j]==1&&!visted[j]) //找到此顶点邻接点,且没有被访问过的
DFS(g,j,visted); //继续递归
}
void DFSTraverse(MGraph&Graph,int*visted)
{
for(int i=0;i<Graph.numvertexs;i++)
visted[i]=0;
for(int j=0;j<Graph.numvertexs;j++)
if(!visted[j])
DFS(Graph,j,visted); //如果是连通图就调用一次
}
int main()
{
int visted[9]; //把访问到的顶点处在在里面
MGraph Graph;
CreateGraph(Graph); //创建图
DFSTraverse(Graph,visted); //遍历图,并输出
return 0;
}