图的广度优先遍历
来源:互联网 发布:程序员的概率统计 编辑:程序博客网 时间:2024/04/29 18:34
图的广度优先遍历
(1)邻接表表示图的广度优先搜索算法
void BFS(ALGraph*G,int k)
{// 以vk为源点对用邻接表表示的图G进行广度优先搜索
int i;
CirQueue Q; //须将队列定义中DataType改为int
EdgeNode *p;
InitQueue(&Q);//队列初始化
printf("visit vertex:%e",G->adjlist[k].vertex);//访问源点vk
visited[k]=TRUE;
EnQueue(&Q,k);//vk已访问,将其人队。(实际上是将其序号人队)
while(!QueueEmpty(&Q)){//队非空则执行
i=DeQueue(&Q); //相当于vi出队
p=G->adjlist[i].firstedge; //取vi的边表头指针
while(p){//依次搜索vi的邻接点vj(令p->adjvex=j)
if(!visited[p->adivex]){ //若vj未访问过
printf("visitvertex:%c",C->adjlistlp->adjvex].vertex); //访问vj
visited[p->adjvex]=TRUE;
EnQueue(&Q,p->adjvex);//访问过的vj人队
}//endif
p=p->next;//找vi的下一邻接点
}//endwhile
}//endwhile
}//end of BFS
(2)邻接矩阵表示的图的广度优先搜索算法
voidBFSM(MGraph *G,int k)
{以vk为源点对用邻接矩阵表示的图G进行广度优先搜索
inti,j;
CirQueueQ;
InitQueue(&Q);
printf("visitvertex:%c",G->vexs[k]); //访问源点vk
visited[k]=TRUE;
EnQueue(&Q,k);
while(!QueueEmpty(&Q)){
i=DeQueue(&Q); //vi出队
for(j=0;j<G->n;j++)//依次搜索vi的邻接点vj
if(G->edges[i][j]==1&&!visited[j])
{//vi未访问
printf("visitvertex:%c",G->vexs[j]);//访问vi
visited[j]=TRUE;
EnQueue(&Q,j);//访问过的vi人队
}
}//endwhile
}//BFSM
对于具有n个顶点和e条边的无向图或有向图,每个顶点均入队一次。广度优先遍历(BFSTraverse)图的时间复杂度和DFSTraverse算法相同。
当图是连通图时,BFSTraverse算法只需调用一次BFS或BFSM即可完成遍历操作,此时BFS和BFSM的时间复杂度分别为O(n+e)和0(n2)。
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的遍历-(深度优先&广度优先)
- 图的遍历:深度优先、广度优先
- 图的遍历-广度优先遍历
- 图的遍历- 广度优先遍历
- 图:图的遍历(深度优先遍历、广度优先遍历)
- 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?
- 6个用于大数据分析的最好工具
- Android传感器Sensor工作流程
- 图的邻接表的形式说明及其建表算法
- 图的深度优先遍历
- 图的广度优先遍历
- 最新银行存款利率表2013
- 给你两个有序链表,编写一个函数,把两个链表合并成一个新的有序链表,返回头指针
- LINUX中什么是僵尸进程和孤儿进程,它们是否消耗系统资源?
- 识别CMYK无法打印的RGB颜色
- 操作系统中同一父进程中的子进程之间如何交互?不同父进程中的子进程之间如何交互?
- 存储过程的概念以及优缺点是什么?
- 写出斐波那契数列的递归与迭代代码,并分析时间和空间复杂度。
- 递归算法的时间复杂度分析