9、图

作者: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种

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值