图的遍历:
深度优先搜索
从任意节点开始,
- 访问v。
- (递归的)访问每一个依附于v的(未访问过的)节点。
如果图是连通的,我们最终可以到达所有的节点。
深度优先搜索递归实现:
要访问图中与节点k相连的所有节点,我们将它标记为访问过的,然后递归的访问k的邻接表中所有未访问过的节点。
void traverse(link k,void (*visit)(int))
{
link t;
(*visit)(k);//从k节点开始,访问该节点
visited[k] = 1;//将该节点标记为已经访问过
for(t=adj[k];t!=NULL;t=t->next)
{
if(!visited[t->v])
traverse(t->v,visit);//递归的访问邻接表中的所有未访问过的节点
}
}
广度优先搜索
要访问图中与节点k相邻的节点,我们把k放到一个FIFO队列中,然后进入一个从这个队列中的到下一节点的循环,并且如果它未被访问到,那么就访问它并把所有未访问的节点压入到它的邻接表中,如此继续,直到队列空为止。
void traverse(int k,void (*visit)(int)) { link t; QUEUEinit(V);//初始化队列 QUEUEput(k);//访问的节点入队列 while(!QUEUEempty()) { if(visited[k = QUEUEget()] == 0 ) { (*visit)(k); //访问 visited[k] = 1;//标记为已访问过 for(t=adj[k];t != NULL;t = t->next)//遍历该节点的各个相邻节点 { if(visited[t->v] ==0)//若相邻节点没有访问过 QUEUEput(t->v);//则入队列 } } } }