广度优先搜索(算法导论第22章-基本的图算法)
来源:互联网 发布:手机淘宝客服怎么设置 编辑:程序博客网 时间:2024/05/17 23:04
广度优先搜索(BFS):
广度优先搜索是最简单的图搜索算法之一,也是许多重要的图算法的原型。Prim的最小生成树算法和Dijkstra的单元最短路径算法都使用了类似广度优先搜索的思想。
假定输入图G=(V,E)是以邻接链表所表示的,该算法使用一个先进先出的队列Q来管理灰色结点集。
同时广度优先搜索是一种在无权图(权值为1)上执行的最短路径算法。
BFS(G,s) for each vertex u∈G.V-{s} u.color=WHITE u.d=∞ u.π=NIL s.color=GRAY s.d=0 s.π=NIL Q=∅ ENQUEUE(Q,s) while Q≠∅ u=DEQUEUE(Q) for each v∈G.Adj[u] if v.color==WHITE v.color=GRAY v.d=u.d+1 v.π=u ENQUEUE(Q,v) u.color=BLACK深度优先搜索(DFS):
深度优先搜索的策略就是:只要可能,就在图中尽量“深入”。深度优先搜索总是对最近才发现的结点v的出发边进行搜索,直到该结点的所有出发边都被发现为止。一旦结点v的所有出发边都被发现,搜索则“回溯”到v的前驱结点(v是经过该结点才被发现的),来搜索该前驱结点的出发边。一直重复直到源结点,如还有未发现的结点。则从未发现的节点中选一个作为源结点,重复上面的过程,直到所有结点都被发现。
深度优先搜索的前驱子图形成一个由多棵深度优先树构成的深度优先森林。
DFS(G) for each vertex u∈G.V u.color=WHITE u.π=NIL time=0 for each vertex u∈G.V if u.color==WHITE DFS-VISIT(G,u)DFS-VISIT(G,u) time=time=1 u.d=time u.color=GRAY for each v∈G:Adj[u] if v.color==WHITE v.π=u DFS-VISIT(G,v) u.color=BLACK time=time+1 u.f=time
图的存储结构—数组表示法
#include<iostream> using namespace std; #define INFINTY_INT_MAX 0x7fffffff //代表正无穷 #define MAX_VERTIEX_NUM 20 //最大顶点个数 #define MAX_INFO 20 typedef enum{DG,DN,AG,AN}GraphKind;//有向图、有向网、无向图、无向网 typedef struct { int adj;//顶点关系类型 char *info;//该弧的相关信息 }ArcCell,AdjMatrix[MAX_VERTIEX_NUM][MAX_VERTIEX_NUM]; typedef struct { char vexs[MAX_VERTIEX_NUM];//顶点向量 AdjMatrix arcs;//邻接矩阵 int vexnum,arcnum;//顶点数、弧数 GraphKind kind;//种类 }MGraph,*pMGraph; int LocateVex(MGraph G,char u) { int i = 0; for(i = 0; i < G.vexnum;i++) { if(u == G.vexs[i]) { return i; } } return -1; } bool CreateDG(MGraph &G) { int incInfo = 0; int i,j,k,l; char va,vb; char *info; char s[MAX_INFO] = {0};//存放弧信息 cout<<"请输入有向图G的顶点数,弧数,弧是否含其它信息(是:1,否:0)"<<endl; cin>>G.vexnum; cin>>G.arcnum; cin>>incInfo; cout<<"请输入顶点值"<<endl; for(i = 0; i < G.vexnum; i++)//构造顶点向量 { cin>>G.vexs[i]; } for(i = 0; i < G.vexnum; i++)//初始化邻接矩阵 { for(j = 0 ;j < G.vexnum; j++) { G.arcs[i][j].adj = 0; G.arcs[i][j].info = NULL; } } cout<<"请输入每条弧的弧头和弧尾"<<endl; for(k = 0; k < G.arcnum; k++) { cin>>va; cin>>vb; i = LocateVex(G,va); j = LocateVex(G,vb); G.arcs[i][j].adj = 1; if(incInfo) { cout<<"输入该弧的信息"<<endl; cin>>s; l = strlen(s); if(l) { info = (char *)malloc(sizeof(char) * (l+1)); strcpy(info,s); G.arcs[i][j].info = info; } } } G.kind = DG; return true; } void Display(MGraph G) { int i,j; cout<<"顶点:"; for(i = 0; i < G.vexnum; i++) { cout<<G.vexs[i]<<" "; } cout<<endl; cout<<"边"<<endl; for(i = 0; i < G.vexnum; i++) { for(j = 0; j < G.vexnum; j++) { cout<<G.arcs[i][j].adj<<" "; } cout<<endl; } } int main() { MGraph G; CreateDG(G); Display(G); return 0; }
0 0
- 广度优先搜索(算法导论第22章-基本的图算法)
- 算法导论-第22章-基本的图算法-22.2 广度优先搜索(BFS)
- 算法导论-第22章-基本的图算法-22.2 广度优先搜索-22.2-4 用邻接矩阵方法实现BFS
- 算法导论 第22章, 广度优先搜索算法
- 第22章:图的基本算法—广度优先搜索和深度优先搜索
- 《算法导论》笔记 第22章 22.2 广度优先搜索
- 算法导论-第22章-基本的图算法-22.3 深度优先搜索(DFS)
- 算法导论 第22章 图的基本算法(二) 深度优先搜索
- 图的广度优先搜索----算法导论
- 算法导论-----图(广度优先搜索)
- 算法导论滴2章图的基本算法--广度优先搜索
- 算法导论 第22章 图算法 22.2 广度优先搜索
- 【算法导论】图的广度优先搜索遍历(BFS)
- 图的基本算法(二、广度优先搜索)
- 算法导论-图的搜索算法之深度优先搜索和广度优先搜索
- 算法导论--广度优先搜索(无向图)
- [算法] 基本图算法的c++实现:广度优先搜索
- [算法] 基本图算法:深度优先搜索、广度优先搜索
- leetcode Clone Graph
- hdu 4909 String dp+哈希
- Insertion Sort List 链表插入排序
- [Eage、Eage S系列] 预装Win 8的机型更换Win7及Windows XP如何设置
- HDU 4911 Inversion 解题报告(逆序数)
- 广度优先搜索(算法导论第22章-基本的图算法)
- 常用的APT命令参数
- 动态二维数组
- bzoj1207: [HNOI2004]打鼹鼠
- java的System.getProperty()方法可以获取的值
- Black Box——优先队列
- SetROP2 (hdc, R2_NOT) 函数功能测试
- 51单片机实现scanf和printf函数
- HDU 4913 Least common multiple 解题报告(线段树)