//关于图的遍历
//深度优先搜索 DFS
//DFS算法时二叉树先序遍历的推广
//DFS算法步骤:
//1.访问起始顶点v,并将顶点v标记为已访问
//2.访问顶点v未被访问过的第一个邻居顶点w,并将顶点标记为已访问。将w作为起始顶点(即:将w赋值给v),
//重复执行步骤1,2,直到v的所有邻居顶点都已经被访问时为止。
//3.返回前一个访问过的且仍有未被访问过的邻接点的顶点x,将x作为起始顶点(即:将x赋值给v)重复步骤1,2,3,
//直到图中所有的顶点都被标记为已访问时,算法结束。
int visited[G.verNum];//visited数组:1表示已访问,0表示未访问
void DFS(Graph G,int v){
visit(v);//访问v顶点(根据实际需要定义visit函数)
visited[v]=1;//注意:visited是全局变量,不传入DFS作为参数
for(int w=findFstN(G,v);w>=0;w=findNextN(G,v,w)){
if(visited[w]!=1){//选取为未被访问过的邻居顶点进行访问
DFS(G,w);
}
}
}
void DepthFirstSearch(Graph G){
for(int v=0;v<=G.verNum;v++){
//TODO
visited[v]=0;
//对每个极大连通子图分别调用一次DFS函数
}
for(int v=0;v<G.verNum;v++){
if(visited[v]!=1){//过滤掉已经访问过的顶点
DFS(G,v);//从顶点v出发,启动一次深度优先搜索
}
}
}
//BFS算法步骤
//BFS算法是二叉树层序遍历的推广
//BFS算法使用一个队列Q暂存邻接点信息
//1.访问起始顶点v,并且将顶点v加入队列Q
//2.从队列Q中取一个元素,赋值给v,依次访问v未被访问过的邻居顶点,并且将这些邻居顶点依次加入队列Q
//3.重复步骤2,直到队列Q为空时算法结束
//广度优先搜索
int visited[G.verNum];//visited数组:1表示已访问,0表示未访问
void BreadthFirstSearch(Graph G){
for(int v=0;v<G.verNum;v++){
visited[v]=0;
}
initQueue(Q);
for(int v=0;v<G.verNum;v++){
if(visited[v]!=1){
BFS(G,v);
}
}
}
void BFS(Graph G,int v){
visit[v];
visited[v]=1;
enQueue(Q,v);
while(!queueEmpty(Q)){
v=deQueue(Q);
for(int w=findFstN(G,v);w>=0;findNextN(G,v,w)){
if(visited[w]!=1){
visit(w);
visited(w)=1;
enQueue(G,w);
}
}
}
}