无向图 广度优先遍历 c语言实现

这里记录一下无向图的广度优先遍历,无向图用邻接表表示,使用的图的示例图如下,关于图的表示可以参照博客:无向图的表示:邻接矩阵和邻接表,这里不再赘述,无向图的表示的代码被封装到头文件queue.h 中。

另外还涉及到C语言的队列问题,可以参照博客:C 循环队列实现,同样不再赘述,循环队列实现的代码被封装到头文件graph_represent.h 中。

程序使用示例图:

实现要点:

每个定点有三个状态,-1,0,1,-1:表示未发现的节点;0:表示已经发现但是还没有处理的节点;1:表示已经处理的节点。在遍历过程中同样保存了“树边(tree edge)”,树边表示在遍历过程中经历过的点。

程序框架如下:

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
#include "graph_represent.h"

void BFS(struct vNode** adj,int n,int s,int* parent){
    int* color = (int*)malloc(sizeof(int)*(n)); //-1:未发现,0:已发现,未处理, 1:已经处理
    int i;
    Queue* pending = createQue(n);  //创建队列

    for(i=0;i<n;i++){
        color[i] = -1;  //所有节点处于“未发现”状态
    }

    parent[s] = -1;
    color[s] = 0;
    add(pending,s);     //入队操作

    while(!isEmpty(pending)){
        int v = poll(pending);

        struct vNode* w = adj[v];
        while(w != NULL){
            if(color[w->value]==-1){
                color[w->value] = 0;
                add(pending,w->value);
                parent[w->value] = v;/**在这里处理树边**/
            }
            w = w->next;
        }
        printf("%d ",v);/**在这里处理节点**/
        color[v] = 1;
    }
    printf("\n");
}

void main(){

    //获得默认图,一共有7个节点
    int n = 7;
    struct vNode** adjVertics = default_wraper();
    int* parent = (int*)malloc(sizeof(int)*n);

    printf("\nbreadth first search:\n");
    BFS(adjVertics,n,2,parent);//从第二个节点开始遍历
}

从第二个节点开始遍历,输出为:2 0 1 3 5 4 6

时间: 2024-10-02 01:18:01

无向图 广度优先遍历 c语言实现的相关文章

无向图 深度优先遍历 c语言实现

无向图的深度优先遍历的实现,无向图用邻接表表示无向图的表示:邻接矩阵和邻接表. 程序使用的示例图为: 实现要点: 每个节点有三种状态-1,0,1,分别表示未发现,已经发现,已经处理. 代码如下: #include <stdio.h> #include <stdlib.h> #include "graph_represent.h" //后序遍历图 void DFS(struct vNode** adj,int v,int* color){ struct vNode

用c++实现走迷宫,最短路径、广度优先遍历、队列、看懂它,你就掌握了数据结构的几种最常用的算法(c语言也可以看得懂)

#include<iostream> using namespace std; void EnQueue(int i,int j,int k); //入队一个节点 void DeQueue(int *i,int *j,int *k); //获取当前节点的序号和对应的迷宫坐标,然后出列 bool GetNextPos(int *i ,int *j,int count); //得到下一个邻接点的位置 void ShortestPath_BFS(int i,int j); //广度优先遍历寻找最短路

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

图的遍历---深度优先遍历与广度优先遍历

对下图进行遍历,分别采用深度优先和广度优先 1.深度优先遍历的主要思想:首先从一个未被访问的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有顶点都被访问. 显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有顶点被访问. /*深度优先搜索算法遍历图的各个顶点*/ #include<stdio.h> int n, sum, book[101]; int e[101][101

数据结构(C实现)------- 图的广度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述: 设图G的初始状态是所有顶点均未被访问过,在G中的任选一顶点vi为初始出发点,则广度优先遍历 可定义如下:首先,访问初始出发点vi,接着依次访问vi的所有邻接点w1,w2,...,wk;然后,依次访问w1,w2,...,wk 的邻接的所有未被访问过的顶点,依次类推,直到图中所有的和初始点vi有路径相通的顶点都被访问过为止. 算法实现: (1) 访问初始顶点vi (

存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组

图的邻接表+深度优先遍历+广度优先遍历

1 /** 2 无向图的邻接表存储 3 深度优先遍历递归 4 广度优先遍历递归+非递归 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #include <malloc.h> 9 #define N 5 10 #define MAX 50 11 typedef struct A{ 12 int adjvex; 13 struct A* nextArc; 14 }Arc; 15 typedef struct node{

图的邻接表存储表示,图的深度优先和广度优先遍历

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define MAX_VERTAX_SIZE 20 5 #define OK 1 6 #define ERROR 0 7 8 typedef int Status; 9 typedef char ElemType; 10 11 typedef struct EageNode{ 12 int adjacentVertax; 13 struct EageNode* nextAdjacentVer

算法导论—无向图的遍历(BFS+DFS,MATLAB)

华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 无向图的遍历有两种方式-广度优先搜索(BFS)和深度优先搜索(DFS).广度优先搜索在遍历一个顶点的全部节点时,先把当前节点全部相邻节点遍历了.然后遍历当前节点第一个相邻的节点的全部相邻节点,广度优先搜索使用队列来实现.深度优先搜索在遍历当前节点的全部相邻节点时,先对当前节点的第一个相邻节点进行訪