2026/5/24 3:15:46
网站建设
项目流程
化妆品网站设计模板,如何查询关键词的搜索量,标书制作是什么工作,wordpress安装到虚拟主机图的dfs和bfs与树的dfs和bfs思想相同#xff0c;dfs用递归实现#xff0c;bfs用队列实现#xff0c;但为了避免图中的重复遍历#xff0c;需要引入visited数组来标志顶点是否访问过visited中每个顶点的下标与顶点在V集数组中的下标相同#xff0c;每次遍历之前都要初始化为…图的dfs和bfs与树的dfs和bfs思想相同dfs用递归实现bfs用队列实现但为了避免图中的重复遍历需要引入visited数组来标志顶点是否访问过visited中每个顶点的下标与顶点在V集数组中的下标相同每次遍历之前都要初始化为false初始化visitedvoid initVisited(bool visited[]){ memset(visited,0,sizeof(visited)); }邻接矩阵和邻接表的遍历思路都基本相同只是找邻接点的方式不一样DFS每次访问顶点后把visited数组中顶点对应的单元更改为ture然后递归地遍历该节点地所有未访问过在visited中标志为false的邻接点假设是连通图或强连通图邻接矩阵找v的邻接点时遍历v在矩阵中的所有出度即遍历第v行void dfs(MGraph* graph,int v){ //传入一个起点 visit(v); //访问行为 visited[v]true; for(int i0;igraph-vertexNum;i){ //找未访问过邻接点 if(graph-V[v][i]!0graph-V[v][i]!INFIvisited[i]false){ dfs(graph,i); } } }邻接表找v的邻接点时直接遍历节点v的出度链表void dfs(LGraph* graph,int v){ visit(v); //访问行为 visited[v]ture; Edge* pgraph-V[v].firstEdge; while(p){ //找未访问过的邻接点 if(visited[p-id]false){ dfs(graph,p-id); } pp-next; } }BFS每次访问队首顶点后把visited数组中顶点对应的单元更改为ture然后出队并把v节点的所有未访问过的邻接点入队重复下一次循环假设是连通图或强连通图邻接矩阵void bfs(MGraph* graph,int x){ //从x开始 queueint q; //队列 q.push(x); //先把起点入队 while(!q.empty()){ int vq.front(); q.pop(); visit(v); //访问行为 visited[v]true; for(int i0;igraph-vertexNum;i){ //找未访问过邻接点 if(graph-V[v][i]!0graph-V[v][i]!INFIvisited[i]false){ q.push(i); } } } }邻接表void bfs(LGraph* graph,int x){ //从x开始 queueint q; //队列 q.push(x); //先把起点入队 while(!q.empty()){ int vq.front(); q.pop(); visit(v); //访问行为 visited[v]true; Edge* pgraph-V[v].firstEdge; while(p){ //找未访问过的邻接点 if(visited[p-id]false){ q.push(p-id); } pp-next; } } }非连通图或非强连通图的遍历需要在遍历外面套一层循环对图中每个visited不为ture的节点遍历void traversal(MGraph* graph){ //邻接表同理 for(int i0;igraph-vectorNum;i){ if(visited[i]false){ dfs(graph,i); //bfs同理 } } }