Graph
更多Graph 的观念与术语
被vertex v指到的vertex (vertices),称为v的 successor(s) ;指向v的vertex (vertices),称为v的 predecessor(s) 。 以「通讯录」为例, v的通讯录内所有人,都是v的successors;通讯录内含有v名字的人,都是v的predecessors。 至于无向图,则不分指出去或指进来,凡是与v有edge相连的其他vertices,都叫做v的 neighbors 。以「接壤」为例,一个国家的neighbors,就是与它接壤的邻居。 (术语往往都很直觉吧!)
从一个vertex v指出去的箭头个数(其实也就是v的successors个数),叫做v的 out-degree ;指向v的箭头个数(其实也就是v的predecessors个数),叫做v的 in- degree。 以「通讯录」为例, out-degree越高,表示通讯录名单越长; in-degree越高,表示人气越旺(很多人都将你列在通讯录内。小心病毒。)至于无向图,则不分指出去或指进来,与v连线的总数称为v的 degree 。 以「接壤」为例,一个国家的degree,就是与它接壤国家的个数。 Q: 「生下」的in-degree或是out-degree有何特性?当然,现代科技也有可能创造出例外...
两头都落在同一个vertex 上面的edge, 叫做一个loop。 这样的edge 对这个vertex 的degree 贡献了2 次。 一般用graph 描述的问题, 多数都不考虑loop 可能是因为没有太大意义, 例如「握手」; 也可能是因为每个vertex 都有loop 所以干脆全部省略, 例如「通讯录」。 Q: 「爱恋」 图中若出现loop, 可以用希腊神话里面的那一种情结来描述?
起点相同,终点也相同的两条edges,称为 parallel edges 。
一个没有loops,没有parallel edges的图,叫做一个 simple graph 。 我们一般讨论graphs,大多只对simple graphs有兴趣。
degree为0的vertex叫做一个 isolated vertex 「接壤」例中,每个岛国就是一个isolated vertex。 (但印尼与马来西亚并不是。)
一连串edges依序首尾相接,不重复经过同一vertex,称为一个 simple path 。 若从vertex a到vertex b有simple path,则称 b is accessible/reachable from a (从a可以到达b) 「沟通」例中,若a到b有simple path,则表示a讲的话, b可以直接或间接(透过翻译)听懂。
起点和终点相同的simple path,称为一个 simple cycle 。 「沟通」例中,一个simple cycle上面的每个人,都可以彼此直接或间接双向沟通。
一个undirected graph G当中,如果任两个vertices之间都可以找到simple path,则称G为 connected ;否则称G为 disconnected 。 一个graph的每一小块自成connected的部分,称为一个 connected component 。 「接壤」例中,欧亚非大陆上的国家构成一个connected component;南北美大陆上的国家构成一个connected component。 印尼虽然不在亚洲大陆上,但它与马来西亚接壤,马来西亚又与大陆上的国家接壤,所以印尼也算在同一个connected component里面。
至于一个directed graph G 是否为connected, 先忽略它的箭头方向, 将之视为undirected graph, 由这个undirected graph 来判断原图G 是否connected。
边上面有数字的图,叫做 weighted graph 。
从图里面抓一小块出来研究
一个问题以graph表示,有时我们只对其中一小部分感兴趣,从原图G = (V,E)当中取出来的一个小图,就叫做一个subgraph。 严谨地说,从G = (V,E)的V当中随便取出一些vertices V',并且从E当中随便取出一些"两端都落在V'之内"的edges E',所构成的图G ' = (V',E')称为G的一个 subgraph 。 「先修」例中,所有数学课程之间的挡修关系,就是原图的一个subgraph。
图的骨架
从一个connected undirected graph G = (V,E)当中,挑一些edges E'出来,与原图当中所有的vertices合起来成为G' = (V, E')当然是G的一个subgraph。 如果G'满足: (1)它是connected (2)它没有cycle则称G'为G的一个 spanning tree 。 也就是要取够多的edges让它足以张开涵盖所有的vertices;但是又不要取太多edges以免造成cycle。
一个graph 可能有很多不同的spanning trees。 但无论如何, 若G 有n 个vertices 则它的每棵spanning tree 一定恰有n-1 条edges 。
一个weighted connected undirected graph的所有spanning trees当中, edges总和最小的那些spanning trees,称为 minimal spanning trees 。 例如油管布线,或网路线的配置,如果一切以最低成本为考量,而不考虑替代路线,可能就喜欢布成一棵minimal spanning tree。 这里说"minimal"而不说"minimum"主要是因为最小的spanning tree可能不只一棵。
一个disconnected undirected graph G当然就无法有spanning tree了。 但可以为每个connected component找出一个spanning tree,这些spanning trees合起来就称为G的一个 spanning forest 。
至于directed graph G 的spanning tree 或spanning forest 呢? 凡是谈到connected 的问题, 一律先将G 视为undirected graph 来讨论就对了。 因为spanning tree/spanning forest 的定义当中提到connected, 所以比照办理。
特殊的图
一个directed graph,如果里面完全没有cycle,就叫做一个 directed acyclic graph (DAG) 。 「生下」与「先修」必然是DAG。
没有edges,每个vertex都是一个isolated vertex (因而也都是一个独立的connected component),这种graph叫做一个 discrete graph 「生下」例中,如果题目范围内的所有人彼此没有血缘关系,那就是一个discrete graph。
linear graph: ...
任两个vertices之间都有edge相连的undirected graph叫做一个 complete graph 。 具有n个vertices的complete graph,记做K n ,它共有n(n-1)/2条edges。 「沟通」例中,如果题目范围内的所有人都讲同一种语言,那就是一个complete graph。 右图分别是K1, K2, K3与K4。
一个graph,如果可以找到一种拆法,把它所有的vertices分成两国,让所有的edges都横跨两国,也就是同一国内的vertices彼此之间都没有edges,则称此graph为bipartite graph (只允许有"国际线",不可有"国内线") 「爱恋」一例,就是一个bipartite graph。 (除非...)
一个bipartite graph,如果允许有edges的地方都有edges,也就是"国际线"全满,就叫做一个complete bipartite graph。 若它的两国各有m个与n个vertices,则将这个graph记为K m,n ,它共有mn个edges。 右图分别是K 5,2 与K 3,4
连得很紧与连得不太紧的connected graphs
一个connected graph最"脆弱"的地方,是 articulation point 与 bridge :前者是"一拿走,就会令图散开的vertex";后者是"一断掉,就会令图散开的edge"。 这里所谓"散开"指的是令原来的connected graph变成disconnected graph。 一条bridge的两个端点,通常都是articulation points。 (除非端点的degree为1...)
「通讯录」例中,班上两个小圈圈的唯一交集人物就是一个articulation point;两各小圈圈之间唯一有联络的两个人,就是bridge。 一个没有articulation point (当然也就没有bridge)的graph叫做一个 biconnected graph ,也称为 non-separable graph 。 反之,有articulation point的graph叫做一个 separable graph 。 祝各位毕业以后,班上的联络状况是一个biconnected graph,是一个non-separable graph。
一个graph当中,每块大到不能再大的biconnected subgraph ( maximal biconnected subgraph),叫做一个 biconnected component 。 上图为一个separable graph,有3个articulation points, 1条bridge, 3个biconnected components。
绕得回来与绕不回来的图
一个digraph,如果从每个vertex出发,都有路可以到达其他任何一个vertex,就叫做一个 strongly connected graph 。 一个graph当中,每块大到不能再大的strongly connected subgraph ( maximal strongly connected subgraph),叫做一个 strongly connected component 。
如果将一个digraph 的所有strongly connected components 标示出来, 每个component 以一个大vertex 取代, 形成一个新的图, 则这个图是一个DAG。 (可以这样想: digraph 除以strongly connectedness 等于DAG。) 上图为一个strongly connected graph, 它有5 个strongly connected components。 若将每个strongly connected component 以一个vertex 取代, 则成最下方的DAG。
以下尚未整理
Weighted Graph
同构
若G1 = (V1, E1), G2 = (V2, E2), 且f 为一个从V1 到V2 的one-to-one correspondence, 并且保留对应vertices 之间的相邻关系, 则称f 为一个从G1 到G2 的isomorphism. 两个graphs 之间如果可以找到isomorphism, 则称它们为isomorphic graphs.
自己到自己的isomorphism 叫做automorphism.
Planar Graphs
- 可以被 embed (嵌) 到平面上,而所有edges互不交叉的图,叫做 planar graph .
- Kuratowski' Theorem:一个图G为non-planar graph <==> G至少有一个subgraph与K 5 或K 3,3 homeomorphic.
- Euler's Formula: 凡是一个planar graph, 它的vertices, edges, regions 的个数之间必满足下列等式: v-e+r=2
- 一个planar graph 若它没有loop 且至少含一个edge, 则必满足3r <= 2e 且e <= 3v-6. 所以r 属于O(v) 且e 属于O(v).
- 若G为一个planar graph,则可由G定义出它的一个 dual graph (对偶图) G^d如下:在G的每个region r (含infinite region)内画一个G^d的vertex叫它r^d ;找出每对相邻的regions r1与r2 ,及它们之间的分界edge e,然后把r1与r2的dual vertices r1^d与r2^d用一条G^d的edge连起来,命名为e ^d.
- Dual graph 的例子: 地图上的国家边界, 它的dual graph 代表国与国的相邻关系.