首页 > 编程知识 正文

广度优先遍历算法,数据结构广度优先遍历

时间:2023-05-03 13:43:18 阅读:31124 作者:161

题目:对采用邻接表存储的图进行广度优先遍历

分析:相邻表上顶点连接的节点都是其相邻节点,但在宽度优先扫描中类似于分层扫描,访问所有相邻节点。

因此,必须从第一个节点访问其所有相邻节点。 另外,请注意访问相邻触点后,需要依次访问相邻触点的相邻触点

在队列中将我们访问的邻居入队。 这与分层遍历相同,只有这样我们才能访问所有节点。 当然,在这个过程中,可能会有重复访问。

因此,必须使用数组来记录访问true的节点的访问情况

代码如下。

# define maxsize 100 # definetypeint//边表结构struct EdgeNode {int index; //数组中的下标int weight; //权重EdgeNode *next; //下一个相邻点; //顶点表节点结构typedefstructvertexnode { intinfo; //节点信息EdgeNode *firstNode; //第一个相邻节点}Adjlist[MAXSIZE]; //图结构struct ALGraph {Adjlist adjlist; //顶点数组int numE,numV; //边数、顶点数; //队列结构(我们采用顺序队列)结构队列(type*arr ); int front,rear; (; # include stdio.h # include stdlib.hvoidbfs (algraph * g ) ) /开始宽遍历//队列函数squeue * create queue (int ); OOLisempty(squeue*; OOLenqueue(squeue*,TYPE,int ); OOLdequeue(squeue*sq,TYPE *data,int maxSize ); 设置表示已访问int *visited=(int * ) malloc(sizeof(int ) *G-numV )的标志数组,并初始化标志节点是否已访问0。 for(intI=0; i G-numV; I ) {可见[ I ]=0; }Squeue *sq; sq=createqueue(g-numv ); //创建队列//从第一个节点遍历for (inti=0; i G-numV; I ) if (! 已查看[ I ] (//如果未访问,则为printf('%c”,G-adjlist[i] ); //这里假设有一个简单的打印人员访问了visited [ I ]=1//enqueue (sq,G-adjlist[G-numV].info,G-numV ); //入队while (! isempty(sq )//队列不空闲,取出队列的第一个元素并访问TYPE top; dqueue(sq,top,G-numV ); if (! 可视[ top ] (可视[ top ]=1; printf('%c ',G-adjlist[top] ); for (edge node * w=g-adj list [ top ].first node; w; w=w-next(//将当前节点的边表按顺序入队,并与层次遍历匹配的if (! 可视w-index ) enqueue(sq,w-index,G-numV ); }}}}}}int main () Algraph*graph=(Algraph* ) malloc(sizeof ) Algraph* ); //函数声明voidcreategraph(algraph* )的voiddispgraph(Algraph*; //图创建图形(图形); //打印地图dispgraph () graph; //广度优先BFS(graph ); 返回0; 执行结果如下。

你不狠下自己,真的只能落在炮火里。 拼命的时候请不要对自己手下留情。 你只有努力,才适合更好的生活。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。