图---广度优先遍历

1.解决问题:判断一幅图中 从顶点S到顶点V之间是否有一条路径---Dijkstar算法的基础(计算出S--V点中最短路径)

1.使用队列(FIFO)先进先出原则 存储与顶点S相距 N条边的点,直到遍历到V点上  不同于深度优先遍历 不需要进行递归 因此 BFS无法判断图中是否有环的

判断出一个有向图是否有环的是:a.最短路径有向图最短路径Dijkstra不一定能够判断有环,除非Visted数字记录0(false),1(已经访问)2(再一次重复访问);

               b.括扑排序:通过入度0之后记录顶点数与原Vetex相比较;括扑排序只是处理入度为零的算法形式

               c.DFS(深度优先遍历),图处理成树结构时候,找到一个节点保存节点,DFS找到重复节点表面图中有环

 

                            d.但是BFS(广度优先遍历),层次遍历方式,A->C,B->C,图中两条边指向一个公共点C,nodeC访问重复,但是不能判断其中出现环情况
 1 package Graph;
 2
 3 import java.util.LinkedList;
 4 import java.util.Queue;
 5 import java.util.Stack;
 6
 7 public class BreadthFirstPath {
 8     public  Graph G;
 9     public boolean [] marked;
10     private int[] edgeTo;// 记录根结点到其点顶点的路径
11
12     public BreadthFirstPath(Graph G ,int s)
13     {
14         this.G=G;
15         marked=new boolean[G.Vertex];
16         edgeTo=new int[G.Vertex];
17         bfs(G,s);
18         //System.out.println("输出结果");
19         pathTo(4,0);
20     }
21     public void pathTo(int v,int st)
22     {
23         Stack<Integer> path=new Stack<Integer>();
24         for(int x=v;x!=st;x=edgeTo[x])
25         {
26             path.add(x);
27         }
28         path.add(st);
29         System.out.print(st +" to "+v+":  ");
30         while(!path.isEmpty())
31         {
32             System.out.print(path.pop() +" ");
33         }
34         System.out.println();
35     }
36     public void bfs(Graph G,int w)
37     {
38         // 使用队列方式
39         Queue<VNode> queue=new LinkedList<VNode>();
40
41         queue.add(G.graph[w]);
42
43         marked[w]=true;
44
45         while(!queue.isEmpty())
46         {
47             VNode p=queue.poll();
48             EdgeNode edge=p.firstedge;
49             while(edge!=null)
50             {
51                 if(!marked[edge.adjvex])
52                 {
53                     queue.add(G.graph[edge.adjvex]);
54                     edgeTo[edge.adjvex]=p.verternum;
55                     marked[edge.adjvex]=true;
56                 }
57                 edge=edge.nextedge;
58             }
59
60         }
61
62     }
63     public static void main(String[] args) {
64         // TODO Auto-generated method stub
65         int array[][]={{0,1},{0,2},{0,5},{1,2},{5,3},{3,2},{3,4}};
66         int []weight={1,2,3,4,5,6,7};
67         int []vNum={0,1,2,3,4,5};
68         Graph G=new Graph(vNum,weight.length,array,weight);
69         G.PrintGraph(G.graph);
70
71         BreadthFirstPath bf=new BreadthFirstPath(G,0);
72
73
74     }
75
76 }

时间: 2024-10-12 19:59:19

图---广度优先遍历的相关文章

python实现图广度优先遍历、深度优先遍历

一.广度优先遍历-bfs 顾名思义,bfs总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成中心结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用.广度优先遍历的核心思想非常简单,用python实现起来也就十来行代码.下面就是超精简的实现,用来理解核心思想足够了: 1 import queue 2 3 def bfs(adj, start): 4 visited = set() 5 q = queue.Queue() 6 q.put(start)

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先 本篇名言:"生活真象这杯浓酒 ,不经三番五次的提炼呵 , 就不会这样一来可口 ! -- 郭小川" 继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275 1.  原理 首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的

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

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

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

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

对下图进行遍历,分别采用深度优先和广度优先 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 (

图的广度优先遍历

1.广度优先遍历是连通图的一种遍历策略.其基本思想如下: 1).从图中某个顶点V0出发,并访问此顶点: 2).从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点: 3).重复步骤2,直到全部顶点都被访问为止. 2.例如下图 1).从0开始,首先找到0的关联顶点3,4 2).由3出发,找到1,2:由4出发,找到1,但是1已经遍历过,所以忽略. 3).由1出发,没有关联顶点:由2出发,没有关联顶点. 所以最后顺序是0,3,4,

【数据结构-图】图的建立以及广度优先遍历算法

本文利用邻接表的方法将图进行了表示,并且利用广度优先遍历方法对图进行遍历 下面是一个图的示例: 代码如下: #include<iostream> using namespace std; typedef int VexType; typedef struct Arcnode{ VexType data; struct Arcnode *nextarc; }ArcNode; typedef struct Vexnode { VexType data; ArcNode *firstarc; }Vn

以邻接表作为存储结构的图的深度优先遍历和广度优先遍历(c++版)

一.图的存储 用邻接表法存储图,存储结构分为两部分,一部分为存储图的所有顶点的数组,另一部分为挂载在数组的每个元素后面的用来表示顶点的邻接点的链表. 1.存储顶点的结构单元为: class vnode { public: string nodename; bool visted;//进行图的遍历时用于标记图是否被访问过 node *next; vnode() { visted = false; next = NULL; } }; 链表的结构单元为: class node { public: st