图之表示和遍历

学习笔记!!!!!

一、什么是图(Graphy)?

表示“多对多”的关系,包含一组顶点(V表示顶点集合)和一组边(E表示边的集合)。

边是顶点对:(v,w)属于E,其中v,w属于V

有向边<v,w>表示从v指向w的边,不考虑重边和自回路。


图的数据对象集:G(V,E)由一个非空的有限顶点集合v和一个有限边集合E组成。注意,图可以没有边,但至少会有一个顶点。(可以N个顶点,但没有一条边,这也是图)(树可以没有任何节点--空树)


二、使用邻接矩阵表示图

邻接矩阵G[N][N]--N个顶点从0到N-1编号,G[i][j]=1,如果<vi,vj>是G的边,否则为0。但对于无向图邻接矩阵的存储会浪费一半的空间,可以使用一个疮毒为N(N+1)/2的一位数据来存储。

对于网络,G[i][j]值为两点之间边的权重。

度:从某点发出的边数--出度,指向该点的边数--入度。

无向图:对应行或列非0元素个数;

有向图:对应行非0元素个数为出度,对应列非0元素个数为入度。

无向完全图:对于n个顶点的无向图,若有2(n-1)/2条边,则为无向完全图。

三、使用邻接表表示图

邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素。某顶点指针依次指向所有其相连的节点。

需要空间:需要N个头指针+2E个结点(每个结点至少2个域)
注意:邻接表若边数E<N(N-1)/4时是节省空间的,但大于时,节省效果反而不好。也就是说邻接表适合够稀疏的图。
邻接表方便计算无向图顶点的度和有向图顶点的出度,二入度的计算需要构造“逆邻接表”。
邻接表不易检查任意一对顶点间是否存在边。
用邻接表表示有 个顶点、条边的图,则遍历图中所有边的时间复杂度为——O(N+E)

四、图的遍历

深度优先搜索(DFS):类似树的先序遍历
DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,… 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。    

DFS时间复杂度:
用邻接图:O(N+E);用邻接矩阵:O(N*N)

广度优先搜索(BFS):类似于树的层序遍历,程序中借助队列。
从图中的某个顶点V出发,访问之,并将其访问标志置为已被访问,即visited[i]=1;依次访问顶点V的各个未被访问过的邻接 点,将V的全部邻接点都访问到;分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,并使“先被访问的顶 点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问过的顶 点的邻接点都被访问到。依此类推,直到图中所有顶点都被访问完为止 。

BFS时间复杂度:
用邻接图:O(N+E);用邻接矩阵:O(N*N)

BFS:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元用来存储状态)。

DFS:对于解决遍历和求所有问题有效,对于问题搜索深度小的时候处理速度迅速,然而在深度很大的情况下效率不高


连通:如果从V到W存在一条(无向)路径,则称V和W是连通的
路径:V到W的路径是一系列顶点{V, v1, v2, …,vn , W}的集合,其中任一对相邻的顶点间都有图中的边。
路径的长度是路径中的边数(如果带权,则是所有边的权重和)。
如果V到W之间的所有顶点都不同,则称简单路径.
 回路:起点等于终点的路径
连通图:图中任意两顶点均连通(图中任意两个节点,都能找到路径,一个节点的图也是连通图,其连通分量有1个)

连通分量: 无向图极大连通子图(该子图是连通的,并且再加一个节点后,该子图就不连通了)
该连通分量的极大顶点数:再加1个顶点就不连通了
该连通分量的极大边数:包含子图中所有顶点相连的所有边

强连通: 有向图中顶点V和W之间存在双向路径,则称V和W是强连通的(v到w有路径,同事w到v也能找到路径)
强连通图:有向图中任意两顶点均强连通
强连通分量:有向图的极大强连通子图


具有N(>0)个顶点的无向图至少有1个连通分量。(一个节点的图有1个连通分量)
具有N(>0)个顶点的无向图最多有N个连通分量。(该图只有N个顶点,任意顶点间无边)
树是最小的连通图,少一条边便不连通

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值