java 数据结构 无向图_数据结构-无向图

1.图的定义

图(Graph)是由顶点(vertex)的有穷非空集合和顶点之间边(edge)的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合 a.若顶点之间 Vi 和 Vj 之间没有方向,则为无向边,用无序偶对( Vi , Vj )表示 b.若顶点之间 Vi 和 Vj 之间有方向,则为有向边(也称弧),用有序偶对< Vi , Vj >表示, Vi 为弧尾,Vj为弧头

2.图的基本概念

(1)简单图    图中既无吊环又无多重边,即为简单图 (2)无向图   如果图中任意两个顶点之间的边都是无向边(简而言之就是没有方向的边),则称该图为无向图(Undirected graphs) (3)有向图 如果图中任意两个顶点之间的边都是有向边(简而言之就是有方向的边),则称该图为有向图(Directed graphs) (4)完全图      ①无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。(含有n个顶点的无向完全图有(n×(n-1))/2条边)

在无向图中, 顶点的度—TD(v):指依附于该顶点的边的个数,n个顶点e条边的无向图中有以下成立的公式: 权    网 在图中,权(weight)通常是对边赋予的有意义的数值量,边上带权的图称为网或网图(network)

3.图的抽象数据类型定义

ADT Graph DATA 顶点的有穷非空集合和边的集合 InitGraph 前置条件: 图不存在 输入:        无 功能:        图的初始化 输出:        无 后置条件: 构造一个空的图 DestoryGraph 前置条件: 图已存在 输入:        无 功能:        销毁图 输出:        无 后置条件: 释放图所占的存储空间 GetVex 前置条件: 图已存在 输入:        顶点V 功能:        在图中查找顶点V的数据信息 输出:        顶点V的数据信息 后置条件: 图不变 putVex 前置条件: 图已存在 输入:        顶点V,顶点信息value 功能:        在图中查找顶点V并将value的值赋给顶点V 输出:        无 后置条件: 无 InsertVex 前置条件: 图已存在 输入:        顶点V 功能:        在图中插入一个顶点 输出:        如果插入不成功,抛出异常 后置条件:如果插入成功,图中增加了一个顶点

deleteVex 前置条件: 图已存在 输入:        顶点V 功能:        在图中删除一个顶点 输出:        如果删除不成功,抛出异常 后置条件:如果删除成功,图中少了一个顶点 insertArc 前置条件: 图已存在 输入:        顶点U,顶点V,顶点U和V之间边的信息 功能:        在图中插入一条边 输出:        如果插入不成功,抛出异常 后置条件: 如果插入成功,图中增加了一条边 deleteArc 前置条件:  图已存在 输入:        顶点U,顶点V 功能:        在图中删除顶点U和V之间的边 输出:        如果删除不成功,抛出异常 后置条件: 如果删除成功,图中少了一个顶点 DFSTraverse 前置条件: 图已存在 输入:        遍历的起始顶点V 功能:        从顶点V出发深度优先遍历图 输出:        图中顶点的一个线性排序 后置条件: 图保持不变 BFSTraverse 前置条件: 图已存在 输入:        遍历的起始顶点V 功能:        从顶点V出发广度优先遍历图 输出:        图中顶点的一个线性排序 后置条件: 图保持不变

4.无向图的遍历

1问:以哪个顶点为起始顶点 1答:顶点都是平等的,可以选取任意一个顶点,可以按照编号小的开始 2问:图中有回路(几个顶点构成一个圆环),可能重复访问,陷入死循环 2答:给顶点设置一个访问标志,visited[n],n为图中顶点的个数,未访问标志0,如果顶点被访问标志1深度优先遍历: 基本思路: 1.访问顶点V 2.从V的未被访问的邻接点中选取一个顶点W,从W出发进行深度优先遍历 3.重复以上2步,直到图中所有和V有路径相通的顶点被访问到伪代码:(类似树的前序遍历) 1.访问顶点,visited[v]=1; 2.w=顶点v的第一个邻接点; 3.while(w){     if(w未被访问) 从顶点w出发递归执行该算法     w=顶点v的下一个邻接点 }广度优先遍历: 基本思路: 1.访问顶点V 2.依次访问V的各个未被访问的邻接点V1,V2,V3……VK 3.分别V1,V2,V3……VK从出发依次访问他们未被访问的邻接点,并使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问,直到图中所有与顶点V有路径相通的顶点都被访问到

伪代码:(类似树的层序遍历) 1.初始化队列Q 2.访问顶点v,visited[v]=1,顶点入队Q; 3.while(队列Q非空){     v=队列Q的队头元素出队     w=顶点v的第一个邻接点     while(w存在){         if(w未访问){           访问顶点w,visited[w]=1;顶点w入队列Q         }         w=顶点v的下一个邻接点     } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值