Java实现简单图数据结构
2017-11-13 11:06
141 查看
图
所谓图(graph),可定义为G =(V,E)。其中,集合V中的元素称为顶点(vertex);集合E中的元素分别对应于V中的某一对顶点(u,v),表示它们之间存在某种关系,故亦称作边(edge)。图实现的Github链接,该版本使用邻接表实现图。
广度优先搜索
自顶点S的BFS搜索,将首先访问s;再依次访问s所有尚未访问到的邻居;再按后者被访问的先后次序,逐个访问它们的邻居;…;如此不断。在所有已访问到的顶点中,仍有邻居尚未访问者,构成所谓的波峰集(frontier)。于是,BFS搜索过程也可等效地理解为:反复从波峰集中找到最早被访问到顶点V,若其邻居均已访问到,则将其逐出波峰集;否则,随意选出一个尚未访问到的邻居,并将其加入到波峰集中。//广度优先搜索(单个连通域) public int BFS(Vertex<T> v) { Vertex<T> u = null; LinkedList<Edge<T>> ll = null; Edge<T> e = null; //引入辅助队列 LinkedList<Vertex<T>> q = new LinkedList<Vertex<T>>(); //初始化起点 q.add(v); v.setStatus(VStatus.DISCOVEREN); while(!q.isEmpty()) { v = q.poll(); v.setdTime(++clock); ll = v.getEdgeList(); //枚举v的所有邻居 while(!ll.isEmpty()) { e = ll.poll(); u = e.getEndVertex(); if(u.getStatus() == VStatus.UNDISCOVEREN) { u.setStatus(VStatus.DISCOVEREN); q.add(u); System.out.println(u.getLabel().toString()); e.setType(EType.TREE); } else { e.setType(EType.CROSS); } } v.setStatus(VStatus.VISITED); } return clock; }
深度优先搜索
优先选取最后一个被访问到的顶点的邻居//深度优先搜索 public void dfs(Vertex<T> v) { int i = 0; clock = 0; do { if(v.getStatus() == VStatus.UNDISCOVEREN) DFS(v); v = Vertexs.get(i++); } while (i < Vertexs.size()); } private int DFS(Vertex<T> v) { Vertex<T> u = null; Edge<T> e = null; LinkedList<Edge<T>> edges = v.getEdgeList(); v.setdTime(++clock); v.setStatus(VStatus.DISCOVEREN); while(!edges.isEmpty()) { e = edges.poll(); u = e.getEndVertex(); switch (u.getStatus()) { case UNDISCOVEREN: e.setType(EType.TREE); DFS(u); break; case DISCOVEREN: e.setType(EType.BACKWARD); break; default: if(v.getdTime()<u.getdTime()) { e.setType(EType.FORWARD); } else { e.setType(EType.CROSS); } break; } } v.setStatus(VStatus.VISITED); v.setfTime(++clock); System.out.println(v.getLabel().toString() +" dTime = "+ v.getdTime()+" fTime = "+v.getfTime()); return clock; }
相关文章推荐
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- 数据结构(java语言描述)-- 表的简单数组实现
- Java数据结构之简单的连接点(link)实现
- 数据结构笔记--栈的总结及java数组实现简单栈结构
- 数据结构-顺序表Java简单实现
- 数据结构: Java中ArrayList的简单实现
- 数据结构(Java语言)——ArrayList简单实现
- Java实现简单的数据结构(二)
- Java数据结构----栈(Stack)源码分析和用链表简单实现
- 【数据结构和算法】用java简单的实现单链表的基本操作
- java数据结构-简单的模仿实现HashMap类的部分函数
- Java数据结构之简单链表的定义与实现方法示例
- Java实现简单的数据结构(三)
- [数据结构]java实现的简单链表的 头/尾插法
- 数据结构-Java实现-简单回文
- Java实现简单的数据结构(四)
- 数据结构(Java语言)——LinkedList简单实现
- [java数据结构]--java双向链表LinkedList的简单实现
- 数据结构(Java语言)——BinaryHeap简单实现
- Java实现简单数据结构之二叉树结构排序 binary tree