作者:whj95
导读
图的定义
定义1:
图由顶点(vertices)和边(edges)构成
定义2:
有向图(directed graph)表示为(a,b),a为起始点,b为终止点。值得一提的是,无向图的表达为{a,b}.
图的术语
无向图
定义1:
在无向图中,我们把两个有边连接起来的端点,两点彼此称为邻接(adjacent/neighbors),这条边与他们关联(connect).
定义2:
给出无向图中度(degree)的概念,顶点a的度记为deg(a),表示a点邻接的边数。
注:1个环(loop)贡献2个度。
定理1:
握手定理:简而言之,即总度=总边数*2。很容易理解,1条边必然对2个顶点各有贡献1个度(包括自环)。
定理2:
简而证之,由于定理1,总度必为偶数,所以奇数度顶点必有偶数个。
有向图
定义1:
注意此处开始有顺序,邻接分为邻接到(adjacent to)和从…邻接(adjacent from)。我们将首尾的两点分别称为:起点(initial vertex),终点(terminal/end vertex)。
定义2:
介绍入度(deg
−
(v))及出度(deg
+
(v))。入度即为进入的(箭头指入的),出度即为出去的(箭头指出的)。环各贡献1个入度,1个出度。
注意: deg
−
表示入度(可以理解为只索取不给予,毫无贡献,所以给负分“-”)。
定理1:
入度=出度=总边数。
简单理解:“收支平衡的月光族”
图的表示
圈图/C图
圈图(circle)。相邻边相接,示例如下:
星图/S图
星图(star)。有一个中心点与所有的点连接,而其他点各不相连,示例如下:
轮图/W图
轮图(wheel)。圈图+星图(圈图和星图的并运算),示例如下:
完全图/K图
完全图(complete)。每个点与其他所有点都相连,示例如下:
注:无向完全图的边数为C
2n
,有向完全图的边数为P
2n
。理解:即n个点取2个点连线,无向无顺序,有向需顺序。
二部图/偶图
定义:
二部图(bipartite)即为每条边的两个端点必须分别坐落在两个不同的集合(红方 蓝方)里。所以,可用红蓝染色法(相邻顶点颜色不同即二部图,否则不是)来检测一个图是否为二部图。
完全二部图
完全二部图(complete bipartite)定义简述为:二部图中两集合中的元素满射。
如下图所示 K2,3, K3,3, K3,5, and K2,6即为完全二部图:
子图 生成子图 导出子图 主子图
如下图所示,G1是G的生成子图(保留所有顶点即可),G2是G的导出子图(induced subgraph,选出部分顶点及其所有互联边),G3是G的主子图(主图-除去部分顶点及其所有互联边)。
并运算
没什么好说的,并运算的延伸而已。
图的同构
邻接表 (adjacency list)
邻接矩阵 (adjacency matrix)
关系矩阵 (incidence matrix)
同构 (isomorphism)
①首先是否有相同的边、相同的顶点数、各顶点的度。都符合则跳至②,否则不是同构;②检查某些点是否相连,比如度均为2的点是否连接。如图不是同构,因为G中度3与度2相连,H中度3与度3相连:
连通性 connectivity
基本概念
通路 (path):若干点的连线
长度 (length):边的数目
回路 (circuit):头尾点相同
①简单(simple)的定义:通路中没有经过重复边和自环
迹 (trail):简单 path
②基本的定义:通路中没有经过重复点
环 (cycle): 基本 circuit(除了头尾相等)
无向图的连通性
连通性 (connected)
⇐⇒
每个点间都有通路
连通分支 (connected component):无公共点的若干个连通子图的并
割点 (cut vertex):除去一个点及与这点有关的所有边,能把连通图切为若干连通分支
割边/桥 (cut edge/bridge):除去一条边,能把连通图切为若干连通分支
有向图的连通性
强连通 (strongly connected):每个点互相都能到达(双向通路可以间接到达)
弱连通 (weakly connected):不考虑方向,到达即可
G是强连通,因为处处互相都能连通;H是弱连通,因为考虑有向无法处处到达,无向才可以。
计算通路数:贴个例题就好:
欧拉通路及汉密尔顿通路
欧拉通路与欧拉回路
无向欧拉
欧拉回路 (Euler circuit):欧拉+简单回路 走完所有的边不重复并返回起点
欧拉通路 (Euler path):欧拉+简单通路 走完所有的边不重复。例题:
欧拉回路充要条件:所有点都是偶数度
欧拉通路充要条件:有且仅有 2个点为 奇数度,且必须以奇数度作为端点出发
有向欧拉
欧拉回路充要条件:所有点都是入度=出度
欧拉通路充要条件:1个点入度<出度,1个点入度>出度,其他点入度=出度。来个例子:
de Bruijn Cycles
这部分略去。
汉密尔顿通路与汉密尔顿回路
汉密尔顿回路 (Hamilton circuit):汉密尔顿+基本回路 走完所有的点不重复并返回起点
汉密尔顿通路 (Hamilton path):汉密尔顿+基本通路 走完所有的点不重复。例题:
简单判定规律
①存在 度= 1 无汉密尔顿回路
②2度顶点的两条边属于任意汉密尔顿回路
③n>=3时,完全图均有汉密尔顿回路
汉密尔顿回路充分条件(不满足也有可能是汉密尔顿回路)
①狄拉克、奥尔定理(Dirac’s/Ore’s theorem):
②
③完全二部图K(n,n)上下端点相等则有汉密尔顿回路
汉密尔顿通路充分条件
①
最短通路
带权图:每条edge都附上了“权”的色彩,长度length≠边数和,而是=权和。
狄克斯特拉算法 (Dijkstra’s Algorithm)
①选择 定点 v1=0,其他顶点为∞
②与这个顶点的有关边全部走过,并在所有终端点处记下总通路(v1到此终端点)的权和,更新最小值
③沿最短路径移动定点,重复②
具体算法借用数据结构中的例子,以C语言为例:
/*
测试数据 教科书 P189 G6 的邻接矩阵 其中 数字 1000000 代表无穷大
6
1000000 1000000 10 100000 30 100
1000000 1000000 5 1000000 1000000 1000000
1000000 1000000 1000000 50 1000000 1000000
1000000 1000000 1000000 1000000 1000000 10
1000000 1000000 1000000 20 1000000 60
1000000 1000000 1000000 1000000 1000000 1000000
结果:
D[0] D[1] D[2] D[3] D[4] D[5]
0 1000000 10 50 30 60
*/
#include <iostream>
#include <cstdio>
#define MAX 1000000
using namespace std;
int arcs[10][10];//邻接矩阵
int D[10];//保存最短路径长度
int p[10][10];//路径
int final[10];//若final[i] = 1则说明 顶点vi已在集合S中
int n = 0;//顶点个数
int v0 = 0;//源点
int v,w;
void ShortestPath_DIJ()
{
for (v = 0; v < n; v++) //循环 初始化
{
final[v] = 0;
D[v] = arcs[v0][v];
for (w = 0; w < n; w++)
p[v][w] = 0;//设空路径
if (D[v] < MAX)
{
p[v][v0] = 1;
p[v][v] = 1;
}
}
D[v0] = 0;
final[v0]=0; //初始化 v0顶点属于集合S
//开始主循环 每次求得v0到某个顶点v的最短路径 并加v到集合S中
for (int i = 1; i < n; i++)
{
int min = MAX;
for (w = 0; w < n; w++)
{
//我认为的核心过程--选点
if (!final[w]) //如果w顶点在V-S中
{
//这个过程最终选出的点 应该是选出当前V-S中与S有关联边
//且权值最小的顶点 书上描述为 当前离V0最近的点
if (D[w] < min)
{
v = w;
min = D[w];
}
}
}
final[v] = 1; //选出该点后加入到合集S中
for (w = 0; w < n; w++)//更新当前最短路径和距离
{
/*在此循环中 v为当前刚选入集合S中的点
则以点V为中间点 考察 d0v+dvw 是否小于 D[w] 如果小于 则更新
比如加进点 3 则若要考察 D[5] 是否要更新 就 判断 d(v0-v3) + d(v3-v5) 的和是否小于D[5]
*/
if (!final[w] && (min+arcs[v][w]<D[w]))
{
D[w] = min + arcs[v][w];
// p[w] = p[v];
p[w][w] = 1; //p[w] = p[v] + [w]
}
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arcs[i][j];
}
}
ShortestPath_DIJ();
for (int i = 0; i < n; i++)
printf("D[%d] = %d\n",i,D[i]);
return 0;
}
距离矩阵 (distance matrix):行为起始点,列为终端点,有通路的赋权值,无通路的为∞。寻找最短路径用的仍是狄克斯特拉算法①寻找定点v1(即第一行);②然后选择最短路径(下图为25),记下终端点作为新定点(下图为v5即第五行),并通过定点与该行所有元素累加(即走过所有有关边)时时更新最短路径和;③重复②直到所有终端点都遍历 。一发例子如下:
Warshall-Floyd theorem
①第一行第一列 第二行第二列….以此类推画出基准
②忽略其中的无穷项,根据基准权和小的取代权和大的
③选取方法为行选一个列选一个加和,然后行列同时后(下)移一位继续,直至选完
例子:
可平面图
定义:一个图如果各边除了端点外没有其他交点,则可平面(planar)
判定方法:先假设可平面。选取几个点画出可平面图形,然后分割出区域余下的点分别尝试放入不同的区域,看看最后会不会引起矛盾。来发例子:
欧拉公式: v+r = e+2(面+点=边+2)
推论1:
证明为引入面次数的概念,一个面至少有3次,2e =
∑
deg(R)>=3r,再运用欧拉公式可得。可证明K5不可平面
注:不满足一定不可平面,满足不一定可平面
推论2:
证明为推论1+握手定理
推论3:
与1相比实则蕴含v≥4的条件,可证明K3,3不可平面
库拉图斯基定理 (Kuratowski’s Theorem)
理论基础:若该图子图包含K3,3,K5及其同构则一定不可平面
初等细分( elementary subdivison):删除一条边,添加新顶点与删除边的端点各自连接,不改变可平面性
通过引入细分概念寻找同胚图( homeomorphic),引用2个例子:
注:若顶点deg=4,尝试转化为K5;若deg=3,尝试转化为K3,3
图着色
色数 (chrometic number):所有顶点染色(相邻点颜色不同)所需要的最小颜色数
不同图所需色数:
①Kn图,n种(显而易见)
②Km,n图,2种(二部图的标志)
③Cn图,当n为偶数 ,2种(举例即可显而易见)
当n为奇数 ,3种