深度优先搜索(DFS)
思路
一直往前走,如果不能往前则回溯,找上一个顶点没有被访问的,直到所有的顶点被访问
访问次序不确定
对于非连通图:在未访问过的顶点中在进行DFS,换了几次顶点,就可以知道有多少个连通分量
代码
//G是图
void DFS(AM_Graph G,int v) //v是要访问的结点
{
cout<<v;
visited[v]=true; //因为访问了v,将v置0
//vex_num是顶点数
//把邻接矩阵上所有的点都找了一遍
for(int w=0;w<G.vex_num;w++)
{
//邻接矩阵不为0并且没有访问过
if((G.arcs[v][w]!=0)&&(!visited[w]))
DFS(G,w);//递归的进行遍历
}
}
广度优先遍历(BFS)
思路
从图的某一个结点出发,首先依次访问该结点的所有邻接点,再按照这些顶点被访问的先后次序依次访问与它们想邻接的所有被访问的顶点,直到所有结点被访问为止
代码
void BFS(AL_Graph G,int v)
{
cout<<v;
visited[v]=true; //访问过,置true
Queue<int> Q; //队列
Q.enqueue(v); //将访问的结点入队
while(!Q.empty()) //栈非空
{
int u=dequeue(Q); //出队,访问其邻接结点
//将所有的邻接结点遍历一遍
for(Arc_Node m=G.vertices[w].first_arc;m!=NULL;m=m.next_arc)
{
int w=m.adj_vex;
if(!visited[w])
{
cout<<w;
visited[w]=true; //w访问过,置于空
Q.enqueue(w); //将w入队
}
}
}
}