Graph Theory
Simple Graph
在数学上,一个”图”(Graph)G 被严格定义为 。 其中,V 代表 Vertex Set, 表示顶点的集合,E 代表 Edge Set, 表示边的集合
简单图的定义:
- 一条边是基数为 2 的 V 的子集,意味着 no loops ,
- 因为每条边必须是 两个 顶点的集合,比如 ,所以不能有一条边是 ,即一条边不能从一个点出发又回到自己。
- 没有”平行边”(Multiple Edges):
- 因为 本身是一个”集合”。集合的特性是元素不能重复。
- 你不能在 和 之间有 两条 叫 的边 9。
邻接 (Adjacent or Neighbours):两个 Vertices 之间的关系。
- 如果两个顶点被一条边连接,它们就是 adjacent
关联 (Incident):Vertix 和 Edge 之间的关系。 2. 一个顶点是某条边的端点,that v is incident with e
Multiple Graph (多重图) allows loops and multiple edges
Directed Graph / Digraph
定义:它改变了”边”的性质。边不再是 这样的_集合_,而是 这样的有序对.
Path Graph
定义: 个顶点排成一条线
Cycle Graph 环图 -
- 定义:一个有 个顶点的连通图,每个顶点的度数都是 2。通俗地说,就是 个点手拉手围成一个圈。
- Length:一个环的长度指的是这个环由多少条边组成
- 顶点数 :
- 边数 :
- 笔记:环图非常简单,有多少个点,就有多少条边。
- (正方形):4 个顶点,4 条边。
- (五边形):5 个顶点,5 条边。
Complete Graph 完全图 -
- 定义:一个有 个顶点的图,其中每一对不同的顶点之间都有一条边
- 顶点数 :
- 边数 : 无向完全图边数:comb (n, 2) 有向完全图边数:perm (n, 2)
- 笔记:
- “边数”就是”从 个顶点中选 2 个顶点出来连线”的组合数。
- : 条边。
- 反向计算(已知边,求点):
Bipartite Graph
定义:一个图是”二分”的,意思是你可以把它的所有顶点分成两个不相交的集合( 和 ),使得每一条边都是连接中的一个点和 中的一个点 A multigraph is not bipartite if and only if it contains a cycle of odd length.
Partition (分区):
简单来说,就是把一个大集合(比如所有的顶点 )拆分成几个小组。这个拆分必须遵守两条铁律:
- :一个都不能少。每个顶点都必须被分到 或 组里。
- :不能脚踏两只船。一个顶点不能同时属于 和 。
Complete Bipartite Graph 完全二分图 -
- 定义:顶点被分成两个集合 (有个点)和 (有 个点)。 中的每个点都与 中的每个点相连,但 内部和 内部没有连线。
- 顶点数 :
- 边数 :
- 笔记:
- 边数就是两个分区大小的乘积。
- : 个顶点。 条边。
Subgraph
定义: 是 的子图,意思是 是必须通过 删除 的一些顶点或边得到的
- 的顶点必须是顶点的子集。
- 的边必须是 边的子集。
Complement
定义:(G的补图)和 拥有完全相同的顶点 Tips: 的边是 缺失的边 , 是完全图
同构 Isomorphic
图的遍历
Walk 随便走,点和边都可以重复 Closed walk:随便走,要走回去 注意:一个 sequence 可以同时是 walk 和 closed walk Trail : Edge 不能重复,不回到起点 Tour: Edge 不能重复,回到起点 Path: Edge 和 Vertex 都不能重复 Cycle: Edge 不能重复,vertex 除了起点不能重复
哈密顿图
一、定义
哈密顿通路(回路)与哈密顿图定义
设 是一个无向或有向图,若存在一条通路(回路),经过图中每个结点一次且仅一次,则称此通路(回路)为该图的一条哈密顿通路(回路)。具有哈密顿回路的图称为哈密顿图(Hamiltonian graph)。
注意事项
- 规定:平凡图为哈密顿图;
- 哈密顿通路是经过图中所有结点的通路中长度最短的通路;
- 哈密顿回路是经过图中所有结点的回路中长度最短的回路。
二、定理及推论
哈密顿图条件
[!note] 设无向图 是哈密顿图, 是 的任意非空子集,则 ,其中 是从 中删除 后所得到图的连通分支数。
- 此定理是哈密顿图的必要条件,而不是充分条件。
- 主要应用是判断某些图不是哈密顿图,即:若存在 的某个非空子集 使得 ,则 不是哈密顿图。
- 有割点的图一定不是哈密顿图。
推论 1
设无向图 中存在哈密顿通路,则对 的任意非空子集 ,都有 。
定理 2
设 是具有 个结点的简单无向图。如果对任意两个不相邻的结点 ,均有 ,则 中存在哈密顿通路。
[!example] 示例 某地有 5 个风景点,若每个风景点均有 2 条道路与其他点相通。将 5 个风景点看成图中的结点,两风景点间的道路看成是无向图的边,故每个结点的度数均为 2,任意两个不相邻的结点的度数之和等于 4,正好为总结点数减 1。故此图中存在一条哈密顿通路,因此游人可以经过每个风景点恰好一次而游完这 5 处。
定理 3
设 是具有 个结点的简单无向图。如果对任意两个不相邻的结点 ,均有 ,则 中存在哈密顿回路。
推论 2
设 是具有 个结点的简单无向图,。如果对任意 ,均有 ,则 是哈密顿图。
注意
上述定理及其推论给出的是哈密顿图的充分条件,而不是必要条件。例如六边形图,虽不满足部分度数条件,但仍是哈密顿图 。
Alevel 内容
排序方法
Bubble Sort 冒泡排序
两两比较,互相交换。 极端情况下n个元素在n-1之后完成。
Quicksort 快速排序
选择中间的数当pivot,之后不断选新的pivots,写题的时候要把选的pivots写在前面。
Binary Search 二分法
选择中间的数当pivot,和要找的数比大小,然后reject前面或后面。写题的时候要把选的pivot写在前面。
Packing Algorithms 装箱问题
- First-fit: 按照原始列表抓取元素,看能不能装入Bin1,不能就装入Bin2
- First-fit decreasing: 将原始列表降序排列,然后再进行First fit
- Full Bin: 先将能够装满箱子的进行配对,剩下的元素在进行First-fit
- Lower bound for the number of Bins: 所有大小/ 箱子大小,向上取整
Minimum Spanning Tree 最小生成树
Question:在graph里找到总长最短、能把所有点连成一片的tree(所有点之间都能有一条path,且连完的图no cycle
- Vertex/ Node 顶点
- Edge/ arc 边
- Path: a sequence of continuous edges from one vertex to another such that no vertex
- Cycle: a closed path that finishes at the starting vertex
- Connected graph: there exists a path between any two vertices
- Tree: connected graph with no cycles
- Spanning Tree: a subgraph that contains all vertices that is also a tree
- Minimum spanning tree: spanning tree with the lowest weight
MST 算法
问题:把所有边都走一遍的最短经历路线
Prim’s Algorithm
从一个vertex开始,连接它最近的vertex,然后找到一个离已经连接的vertices最近的vertex,继续连接,直到结束
Kruskal’s Algorithm
从最短的边开始,从短到长考虑所有边,只要不形成cycle,就继续选,直到所有vertex连成一片。如果会形成cycle的,要在后面写一个reject。
Route Inspection Algorithm 邮递员问题
Repeat vertices:
- 中间点是 odd vertex
- 起点和中间在同一点,odd vertex
- 起点和终点不是同一点,even vertex
Vertices:A,B,C,D
- AB+CD= (*)
- AC+BD=
- AD+BC=
- AB+CD is the shortest, so repeat …
- Length of inspection route = total weight of graph + (*)
如果是自由选点,一般会有4个odd vertex,选择起点和终点后,剩下的两个odd vertex之间的距离是这四个里面最短的。
The Travelling Salesman Problem
问题:找出把图上所有顶点都走一遍并回到出发起点的最短巡回路径
classical problem:每个顶点走一遍且只走一遍,并回到起点(不允许重复)
practical problem:每个项点至少走一遍,并回到起点(允许重复)
Upper bound
Minimum Spanning Tree Method
- 找到 MST(用 Kruskal 或 Prim 算法)
- 初始的 initial upper bound = 2 * MST
Nearest Neighbour Method
从任意一个 vertex 出发,在没有去过的 vertex 中,选择距离目前最近的 vertex,依次走过所有点,最后回到起点。
格式:NNB route = ACBFA
Upper bound:AC+CB+BF+FA=
Lower bound
Residual Minimum Spanning Tree Method
- 去掉一个 vertex(remove X)
- 找到除了这个点之外的 MST(一般用 Prim 找)
- 找到 remove X 的最短的两条边
- Lower bound = RMST + cost of reconnection(那两条边)
Critical Path Analysis 包工头问题
Total float time for X = last finish for X - early start for X - duration of X 如果一个 critical activity 的前后只有唯一的一个 activity,那么这个 activity 也是 critical 的
Cascade/Gantt Diagram 甘特图
Critical activity 画在第一行,其余的按照顺序各占一行,从 early start time 开始,画完了行程时间后,在中间到 last finish 这段打上阴影
Schedule Diagram 排班时间表
工人 A 画在第一行,做完所有的 critical activity,就是 critical path。其他的工人按照顺序往下正常排列
Lower bound for number of workers
Lower bound 大于等于所有项目耗时总和除以项目所需的完成时间 找到同一列有最多方格的,方格数就是工人数
During time 14 < t < 15, there are activities F, H, K, L. So at least 4 workers needed.
Dijkstra’s Algorithm
不断更新最短路径
Linear Programming 线性规划
-
线性规划问题建模
Objective maximize/minimize P = 3x+5y
Subject to:
- …
- …
- …
-
最优化问题求解: P = ax+by 的极值一定在 feasible region 的顶点处取得,这个顶点叫 optimal vertex(最佳顶点)。
- 方法 1: Object Line Method 画 ax+by=P0 的直线,然后平移
- 方法 2: Point Testing Method 把 feasible region 的顶点都算出来,然后带入 P=ax+by 方程,求出来最大的就是最大值,最小的就是最小值
如果问题是要求(x,y)的整数解,就在 feasible region 范围内,找距离 optimal vertex 最近的整数格点