数据结构 — 图 之 广度优先遍历
来源:互联网 发布:apache tomcat modjk 编辑:程序博客网 时间:2024/04/30 19:07
【描述】: 图的bfs
【输入】:
81 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
- 数据结构 — 图 之 广度优先遍历
- 数据结构与算法专题之图——图的遍历(深度优先遍历和广度优先遍历)
- 数据结构(图遍历--广度优先遍历)
- 数据结构之图的广度优先遍历java实现
- 数据结构之图的的深度与广度优先遍历
- 数据结构之图---广度优先遍历---C++实现
- 《数据结构和算法》之图的广度优先遍历
- 《大话数据结构》之广度优先遍历
- 数据结构之图的深度优先遍历和广度优先遍历
- 数据结构学习之图的深度优先遍历和广度优先遍历
- 数据结构-图的广度优先遍历(BFS)
- 【数据结构】图的遍历--广度优先搜索
- 图的广度优先遍历-数据结构(21)
- 数据结构-图-广度优先遍历邻接矩阵(1)
- 数据结构---图的广度优先遍历和深度优先遍历
- 数据结构——深度优先遍历和广度优先遍历
- 重学数据结构系列之——图的遍历(广度优先搜索和深度优先搜索)学习来源:计蒜客
- 数据结构和算法之:图的深度优先和广度优先遍历及其Java实现
- ThreadPoolExecuter 原理机制
- 引用与指针区别
- Cocos2dx 中文乱码的解决方法
- 动态规划:求最大子段和
- [原]8小时外实践系列之四——从零开始建立一个个人网站
- 数据结构 — 图 之 广度优先遍历
- [Emacs] 1.2 尝试配置emacs(基础与配色)
- Linux下配置Mysql允许远程访问详解
- 子串和子序列并不是一个意思
- Swift如何实现音乐播放,后台播放及控制。
- ActionBar自定义
- python学习笔记(6)
- 最大长方体问题
- .NET学习(三)用DataSet缓存数据库中的数据