1.深度优先搜索
深度优先搜索遍历与树的先序遍历类似,从某个点出发,寻找其第一个未访问过的邻接点,访问该点并以该点为起点寻找其第一个未访问过的邻接点,同时申请一个一维数组,对每一个点若其已经被访问过则将该点在数组中对应的值置为1。这个过程通过递归来实现
若图借助邻接矩阵法表示,dfs的实现代码如下
void DFS(AMGraph G,int v)//从第几个点开始搜索
{
cout<<G.vexs[v]<<endl;
visited[v]=1;
for(int i=0;i<G.vexnum;i++)
{
if((!visited[i])&&(G.arcs[v][i]!=maxint))
DFS(G,i);
}
}
若图借助邻接表法表示
void DFS(ALGraph G,int v)//从第几个点开始搜索
{
cout<<G.vertices[v].name<<endl;
visited[v]=1;
int w;
Arcnode *t;
t=G.vertices[v].firtstarc;
while(t!=NULL)
{
w=t->p;
if(!visited[w])
DFS(G,w);
else
t=t->next;
}
}
在t指针未指到单链表终点之前若找到未被访问过的点,则从该点开始继续搜索。若指到终点,则搜索结束,连通图中的每一个点均被访问到。
2.广度优先搜索
广度优先搜索与树的层序遍历类似,遍历从某一个节点开始,查看它的所有邻接点,若邻接点未被访问则访问该点并将该点加入队列;当前一个点的所有邻接点都被访问完后,再弹出队列的首元素查看它的所有邻接点。
图的广度优先搜索的代码如下(以邻接表法为例)
void BFS(ALGraph G,int v)
{
cout<<G.vertices[v].name<<' ';
Q.push(v);
visited[v]=1;
int i,k;
Arcnode *j;
while(!Q.empty())
{
i=Q.front();//返回队列头元素的值
Q.pop();//队头元素出队
j=G.vertices[i].firtstarc;
while(j!=NULL)
{
k=j->p;
if(!visited[k])
{
cout<<G.vertices[k].name<<' ';
visited[k]=1;
Q.push(k);
}
j=j->next;
}
}
}