关闭

数据结构 — 图 之 广度优先遍历

标签: 数据结构广度优先遍历bfs
416人阅读 评论(0) 收藏 举报
分类:

【描述】:  图的bfs


【输入】:

8
1 2 -1
0 3 4 -1
0 5 6 -1
1 7 -1
1 7 -1
2 7 -1
2 7 -1
3 4 5 6 -1


【输出】:


0 1 2 3 4 5 6 7


/*
 *图的广度优先遍历
 *1.链式队列(链表的头节点中存数据、节点的尾插法、头节点的删除)
 *2.bfs 

8 
1 2 -1 
0 3 4 -1 
0 5 6 -1 
1 7 -1 
1 7 -1 
2 7 -1 
2 7 -1 
3 4 5 6 -1 
 */

#include<iostream>
#include<memory.h>
using namespace std;

/* 宏定义 */
#define MAX_NUM 50
#define ElementType int

/* 定义动态链式队列节点 */
typedef struct QueueNode{
    ElementType data;
    struct QueueNode *next;
}QueueNode,*QueuePointer;

/* 邻接表表节点 */
typedef struct TableNode{
    ElementType vertex;
    struct TableNode *next;
}TableNode,*TablePointer;

/* 头节点数组 */
TablePointer graph[MAX_NUM];

/* 定义visited数组 */
bool visited[MAX_NUM];

/* 顶点数 */
int vertices;

/*
 * 动态链式队列
 * 1.addq -> 入队
 * 2.deleteq -> 出队
 */
/*在链式队列的队尾插入元素*/
void addq(QueuePointer &front, QueuePointer &rear, ElementType item){
    QueuePointer temp = new QueueNode;
    temp->data = item;
    temp->next = NULL;

    //插入
    if(front){
        rear->next = temp;
    }else{
        front = temp;
    }
    rear = temp;
}

/*从链式队列的头部出队*/
ElementType deleteq(QueuePointer &front){
    QueuePointer temp = front;
    ElementType item;

    //出队
    item = temp->data;
    front = temp->next;
    delete temp;
    return item;
}

/*
 * 邻接表存储的图
 * 1.创建图
 * 2.bfs
 */
/*创建*/
void CreateGraph(){  
    ElementType ch;  
    TablePointer pnew,qnode;  
    pnew = qnode = NULL;  
  
    for(int i = 0; i < vertices; i++){  
        cin>>ch;  
        if(ch == -1) continue; /*当ch 为-1是结束该vertex的创建*/  
        //链表的头节点  
        pnew = new TableNode;  
        pnew->vertex = ch;  
        pnew->next = NULL;  
        //将头节点存入 头节点数组  
        graph[i] = pnew;  
        //尾插法创建链表  
        cin>>ch;  
        while(ch != -1){  
            //申请内存、处理数据域、处理指针域  
            qnode = new TableNode;  
            qnode->vertex = ch;  
            qnode->next =NULL;  
            //插入  
            pnew->next = qnode;  
            //更新尾指针  
            pnew = qnode;  
            cin>>ch;  
        }  
    }  
}

/*bfs*/
void bfs(ElementType v){
    TablePointer w;
    QueuePointer front, rear;
    front = rear = NULL;

    //将第一个节点输入、标记、进队
    cout<<v<<endl;
    visited[v] = true;
    addq(front, rear, v);

    //访问队列中的节点、访问与其相邻的节点、已经被visited的节点将不再访问
    while(front){
        v = deleteq(front);
	//扫vertex v 的链表
        for(w = graph[v]; w; w=w->next){
            if(!visited[w->vertex]){
                cout<<w->vertex<<" ";
		visited[w->vertex] = true;
                addq(front, rear, w->vertex);
            }
	}
    }
	cout<<endl;
}

int main(){  
  
    memset(visited,false,sizeof(visited));  
  
    cout<<"输入顶点数"<<endl;  
    cin>>vertices;  
  
    CreateGraph();  
    cout<<"广度优先遍历"<<endl;  
    bfs(0);  

    return 0;  
}  

【运行结果】:


0
0
查看评论

数据结构之图的深度优先遍历和广度优先遍历

1.图的简单介绍 上图就是一个图(无线图),由顶点和连线组成 图可以分为无向图和有向图(这个又有出度、入度的概念)、网,一般来说图有两种常用的表示方式,邻接矩阵(用二维数组的形式表示)和邻接表(主要是数组+链表的形式表示),图常用的遍历方式有深度优先遍历(DFS)和广度优先遍历(BFS)。 由于等...
  • sinat_30186009
  • sinat_30186009
  • 2016-07-23 10:21
  • 1834

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

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述:           设图G的初始状态是所有顶点均未被访问过,在G中的任...
  • jesson20121020
  • jesson20121020
  • 2015-01-16 00:10
  • 1016

数据结构:图的遍历--深度优先、广度优先

图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点。当然,每个顶点有且只能被访问一次。 在图的遍历中,深度优先和广度优先是最常使用的两种遍历方式。这两种遍历方式对无向图和有向图都是适用的,并且都是从指定的顶点开始遍历的。先看下两种遍历方式的遍历规则: 深度优先 深度优先遍历也叫深度...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014-08-02 11:20
  • 36147

【数据结构】图的遍历方法 深度优先遍历和广度优先遍历

图的遍历方法 深度优先遍历和广度优先遍历 接着上次的文章“图的构建(邻接链表法)”,邻接链表法构建图相对来说比较简单,并且遍历起来也相对简单,但是要是动态添加图的节点和图的边,则是实在不方便,不过现在不管那么多,今天的主题是遍历。  - 有另外一种图的构建方法,叫做十字链表法,插...
  • sundong_d
  • sundong_d
  • 2015-04-11 09:45
  • 14794

图广度优先遍历(队列实现)

/* breadth-first traversal by using a queue * @method: use queue * Graph is stored in an adjacency matrix */ #include #include #define MAX 10 in...
  • yangjin_unique
  • yangjin_unique
  • 2012-08-07 14:58
  • 2804

图的广度优先遍历::邻接矩阵+队列.

之前用队列的时候,实现方式很简陋:一维数组+两个指针。现在先规范的写出队列的所有函数的算法,然后放到一个头文件中,直接调用函数。一开始很不习惯,主要是以前编程都是等到要什么功能的函数就地编写。后来看到C++中一些关于代码重用的说法,再想想自己确实写了很多功能相似的函数也即做了很多无用功。于是狠下心来...
  • liu2614332
  • liu2614332
  • 2014-01-05 20:26
  • 782

Java实现图的遍历(深度优先与广度优先遍历)

点击跳转到文章原文图的遍历所谓图的遍历,即对图中的每个节点进行访问,而对含有许多点的图遍历并不轻松,往往有如下两种遍历策略: 深度优先遍历 广度优先遍历 深度优先遍历深度优先遍历,即从初始节点开始访问,而初始节点与多个节点相连接,所以,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问...
  • xu__cg
  • xu__cg
  • 2016-09-27 19:08
  • 1390

算法:图的广度优先遍历(Breadth First Search)

图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traverse Graph)。 图的遍历方法一般有两种,第一种是我们在前面讲过的《深度优先遍历(Depth First Search)》,也有称为深度优先搜索,简称为DFS。第...
  • Simba888888
  • Simba888888
  • 2013-04-30 09:22
  • 17435

数据结构——图之广度优先遍历算法

//图的广度优先遍历算法、#include &quot;stdafx.h&quot;#include&amp;lt;iostream&amp;gt;using namespace std;#define OK 1#define ERROR -1#define MAXN...
  • qq_38711920
  • qq_38711920
  • 2018-02-13 21:00
  • 83

图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程

图 深度优先遍历 广度优先遍历 图解算法过程
  • collonn
  • collonn
  • 2014-01-06 18:12
  • 15073
    个人资料
    • 访问:149614次
    • 积分:3862
    • 等级:
    • 排名:第9802名
    • 原创:242篇
    • 转载:17篇
    • 译文:0篇
    • 评论:13条
    博客专栏
    最新评论