tags: Combinatorics GT

写在前面

最近开始更新图论笔记系列, 没办法做到面面俱到了, 就把自己觉得重要的内容放上来, 有任何问题欢迎大家指正.

主要概念

  • 图(graph): 关系的数学表达, 由两个集合: 非空结点集VVV和有限的边集EEE组成.
  • 图的阶(order): 集合V(G)V(G)V(G)的基数(势)nnn.
  • 图的规模(size): 集合E(G)E(G)E(G)的基数mmm.
  • 邻接(adjacent): 指两个节点之间有边连接.
  • 关联(incident): 边与左右两个节点关联.
  • 结点的度(degree): 与结点相邻接的结点数.

  • 孤立点: 度为000的结点.
  • 最小度: 图中所有结点的最小度数, 记为δ(G)\delta(G)δ(G).
  • 最大度: 图中所有结点的最大度数, 记为Δ(G)\Delta(G)Δ(G).
  • 正则图(regular graph): 若图中所有结点有相同的度数, 则δ(G)=Δ(G)\delta(G)=\Delta(G)δ(G)=Δ(G).
  • r−r-r−正则图: 图中所有结点度都为rrr.

  • u−vu-vu−v通道(途径, walk): 指从结点uuu出发, 经过一个交互的结点和边的序列, 最后回到结点vvv的路径, 其中连续的结点和边是相关联的.
  • 通道的长度: 经过边的数量, 结点和边可以重复.
  • 迹(trail): 没有重复边的通道, 结点可以重复.
  • 路(路径, path): 结点都不相同的迹.
  • 回路(圈, cycle): 即封闭的路径(闭路, closed path), 由于结点不同则边一定不同, 所以回路也可以称为闭迹(closed trail).
  • u−vu-vu−v路: 将uuu和vvv连接起来的路.

  • 连通图(connected graph): 图中任意两个结点之间都存在路.
  • 测地线路(测地线, 最短路): 长度最短的u−vu-vu−v路.
  • 子图: HHH结点集与边集都为GGG的结点集和边集的子集, 且对HHH中任意一条边, 其两个节点都在结点集V(H)V(H)V(H)中. GGG称为HHH的超图.
  • 连通分量(connected component): 极大连通子图.
  • 生成子图(spanning subgraph): V(H)=V(G)V(H)=V(G)V(H)=V(G).
  • 导出子图(induced subgraph): 子图边集中包含了GGG中连接子图点集的所有边.

  • 完全图(complete graph): 所有结点对都邻接. 具有nnn个结点的完全图记为KnK_nKn​.
  • 平凡图(trivial graph): K1K_1K1​.
  • 圈(circle): 含有nnn个结点的圈记为CnC_nCn​.
  • 路(path): 含有nnn个结点的路记为PnP_nPn​, 并且满足Pi=K1,P2=K2P_i=K_1, P_2=K_2Pi​=K1​,P2​=K2​.
  • 完全二分图(complete bipartite graph): 记为Km,nK_{m,n}Km,n​, 是指图的结点集可以分成两个非空集合A,BA,BA,B, 分别含有m,nm,nm,n个结点, AAA中每个结点均要与BBB中每个结点相关联,且都与BBB中结点相关联.
  • : 只有一个结点度为nnn, 其余nnn个结点度为111的完全二分图, 记为K1,nK_{1,n}K1,n​.

图同构

  • 图同构: 图GGG中结点uvuvuv邻接当前节点它们在图HHH中相应的结点也邻接, 记为G≅HG\cong HG≅H. 图同构则节点的度一定相同.
  • 度序列: 含有nnn个结点图GGG的度序列指按照结点度数排列的n−n-n−元非递增序列. 有相同度序列的两图不一定同构.
  • 可绘图序列: 可以表示某个图的非负整数的非递增序列.
  • 可绘图序列的必要条件: 度数之和为偶数.

可绘图序列的判定算法

  1. 序列SSS中删除第1个数kkk.
  2. 如果SSS的第一个数后的kkk个数都大等1, 则将这kkk个数分别都减去1得到新序列S′S'S′; 否则停止, 得出原序列不绘图. 若S′S'S′全是000, 停止, 得到原序列可绘图.
  3. 将2得到的序列S′S'S′重新排列, 得到非增序列S∗S^*S∗.
  4. 令S=S∗S=S^*S=S∗,转步骤1.

例子:判断序列[3,3,2,1,1,1][3,3,2,1,1,1][3,3,2,1,1,1]是否可绘图.

直接根据上述算法进行判断, 下面给出Python以及C++代码:

S1 = [3, 2, 2, 1, 1, 1]
S2 = [5, 4, 4, 3, 3, 3, 3, 2, 2, 1]
S3 = [7, 7, 4, 3, 3, 3, 2, 1]
S4 = [6, 5, 4, 3, 3, 3, 2, 0]def isGraphic(S):if len(S) == 0 or sum(S) % 2 == 1:return False# 只要不是全0序列, 就进入循环while S.count(0) != len(S):k = S.pop(0)if k <= len(S):for i in range(k):if S[i] >= 1:S[i] -= 1else:return FalseS.sort(reverse=True)else:return Falsereturn Trueprint(isGraphic(S1))
print(isGraphic(S2))
print(isGraphic(S3))
print(isGraphic(S4))
"""
True
True
False
True
"""

对于python代码, 用到了一些列表操作的内置函数, 进一步优化可以得到下面的代码:

def isGraphic(S):if len(S) == 0 or sum(S) % 2 == 1:return False# 只要不是全0序列, 就进入循环while S[0] != 0:k = S.pop(0)if k <= len(S):for i in range(k):if S[i] >= 1:S[i] -= 1else:return FalseS.sort(reverse=True)return True
// C++代码实现
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>using namespace std;bool isGraphic(vector<int> &S) {if (S.size() == 0 || accumulate(S.begin(), S.end(), 0) % 2 == 1){return false;}while(S[0] != 0) {int k = S[0];S.erase(S.begin());if (k <= S.size())for (int i=0;i<k;i++) {if (S[i] >= 1)S[i]--;elsereturn false; }sort(S.rbegin(), S.rend());}return true;
}int main(int argc, char const *argv[])
{vector<int> S1 = {3, 2, 2, 1, 1, 1},S2 = {5, 4, 4, 3, 3, 3, 3, 2, 2, 1},S3 = {7, 7, 4, 3, 3, 3, 2, 1},S4 = {6, 5, 4, 3, 3, 3, 2, 0};cout<<isGraphic(S1)<<endl;cout<<isGraphic(S2)<<endl;cout<<isGraphic(S3)<<endl;cout<<isGraphic(S4)<<endl;return 0;
}

图的基本操作

并与和

两个图的并必须是不相交的, 对于图GGG和HHH, 有

G∪H:{V(G∪H)=V(G)∪V(H)E(G∪H)=E(G)∪E(H)G\cup H:\begin{cases} V(G\cup H)=V(G)\cup V(H)\\[5pt] E(G\cup H)=E(G)\cup E(H)\\ \end{cases} G∪H:⎩⎨⎧​V(G∪H)=V(G)∪V(H)E(G∪H)=E(G)∪E(H)​

两个不相交图的和G+HG+HG+H是指在G∪HG\cup HG∪H的基础上, 增加GGG的每个结点与图HHH的每个结点相连接得到的边.

边与结点的删除

  • 设vvv是GGG 的结点, 则G−vG-vG−v是指从图GGG 中删除结点vvv, 并将所有与结点vvv相关联的边删除.
  • 设eee是图GGG 的一条边, 那么G−eG-eG−e是指从图GGG 中删除边eee.

补图

类比集合的补运算, 图GGG的补图G‾\overline{G}G满足V(G‾)=V(G)V(\overline G)=V(G)V(G)=V(G), 并且当且仅当uv∉E(G)uv\notin E(G)uv∈/​E(G)时, uv∈E(G‾)uv\in E(\overline G)uv∈E(G).

  • 自补图: 图GGG与其补图同构. 自补图GGG满足阶nnn可以表示成4k4k4k或者4k+14k+14k+1的形式, kkk为非负整数, 并且图GGG有n(n−1)/4n(n-1)/4n(n−1)/4条边.

笛卡尔积

又称叉乘, 指两个图的结点之间进行笛卡尔积. 满足结合律.

利用笛卡尔积可以定义如下的几种图.

超立方体

递归定义, 可由定义式扩展到高维空间.

Q1=K2,Qn=K2×Qn−1.Q_1=K_2,Q_n=K_2\times Q_{n-1}. Q1​=K2​,Qn​=K2​×Qn−1​.

网格

M(m,n)=Pm×Pn,M(p,q,r)=Pp×Pq×Pr.M(m,n)=P_m\times P_n,\\ M(p,q,r)=P_p\times P_q\times P_r. M(m,n)=Pm​×Pn​,M(p,q,r)=Pp​×Pq​×Pr​.

线图

线图L(G)L(G)L(G)的结点集由原图GGG边构成, 将原图GGG结点进行标记之后容易得到线图.

边收缩

设uvuvuv是GGG的一条边, 将节点u,vu,vu,v和与这两个结点相关联的边都去掉, 并添加一个结点uv∗uv^*uv∗, 使得uv∗uv^*uv∗与原结点u,vu,vu,v相邻接的结点邻接, 记为G/uvG/uvG/uv.

现代图论笔记(一)图论的基础知识相关推荐

  1. 二级VB培训笔记08:公共基础知识

    二级VB培训笔记08:公共基础知识 一.公共基础思维导图

  2. JDBC 学习笔记(一)—— 基础知识 + 分页技术

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

  3. (硅谷课堂项目)Java开发笔记4:前端基础知识(二)

    文章目录 (硅谷课堂项目)Java开发笔记4:前端基础知识(二) 一.NPM 1.NPM简介 1.1.什么是NPM 1.2.NPM工具的安装位置 2.使用npm管理项目 2.1.创建文件夹npm 2. ...

  4. MATLAB学习笔记2:MATLAB基础知识(下)

    阅读前请注意: 1. 该学习笔记是华中师范大学HelloWorld程序设计协会2021年寒假MATLAB培训的学习记录,是基于培训课堂内容的总结归纳.拓展阅读.博客内容由 @K2SO4钾 撰写.编辑, ...

  5. JavaSE学习笔记(一)基础知识

    本章包含内容有: java环境配置.注释.标识符.数据类型.类型转换.变量.常量.运算符.包机制.顺序结构.选择结构.循环结构.方法的定义和调用.命令行传参.可变参数. 点击这里查看更多JavaSE的 ...

  6. 从零开始学习VIO笔记 --- 第一讲:基础知识(四元数,李代数)

    从零开始学习VIO笔记 --- 第一讲:基础知识(四元数,李代数) 一. 向量的内积与外积 二. 旋转与平移 2.1 旋转表示 --- 旋转矩阵R 2.2 平移向量 2.3 变换矩阵T与齐次坐标 2. ...

  7. 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符

    Python学习笔记之[第一章]基础知识 前言: 一.格式化输出 1.基本格式: 2.练习代码: 二.转义字符 1.基本格式: 2.练习代码: 3.输出结果: 三.输入 1.基本格式: 2.练习代码: ...

  8. (个人笔记)C/C++基础知识(二)

    文章目录 一 数组 1.1 一维数组 1.1.1 第一种定义方式 1.1.2 第二种定义方式(推荐) 1.1.3 数组名称的用途 1.2 二维数组 1.2.1 定义方式 1.2.2 二维数组名的使用 ...

  9. GDAL学习笔记02:GDAL基础知识

    你的习惯决定了你会成为什么样的人. GDAL学习笔记02:GDAL基础知识 前言 1. 版本 2. 摘要 3. 说明 4. 微信公众号GISRSGeography 一.GDAL简介 二.导入GDAL ...

  10. html语言需要dw吗,HTML笔记整理1 -- HTML基础知识与DW简单使用

    HTML笔记整理1 -- HTML基础知识与DW简单使用概念客户端和服务器端文件名.基本名.扩展名资源文件和站点什么是HTML关于W3CW3C的规范网站与网页基本概念网页的制作网页的基本框架通过记事本 ...

最新文章

  1. C++中虚函数、虚指针和虚表详解
  2. 002-layui颜色
  3. 电脑软件:5个实用的Windows软件,大幅度提高你的工作效率!
  4. 华为与美国公司就授权5G平台展开初期谈判;Linux 中存在严重漏洞;Microsoft 发布 Cosmos DB GA 版……...
  5. mysql怎么分组查询所有数据库_Mysql-4 分组查询与子查询
  6. cad画圆如何确定圆心_原来在CAD中画个圆也有这么多学问!你知道这些画圆的技巧吗?...
  7. python数据挖掘学习】十五.Matplotlib调用imshow()函数绘制热图
  8. Twitter进军NFT领域 发布并赠送7款NFT数字艺术品
  9. python多线程锁_Python多线程互斥锁使用
  10. iOS开发内存泄露修复
  11. window.onload和$(function(){})的区别介绍
  12. 中国水系Android第一个版本
  13. 10 个最佳地理空间数据分析 GIS 软件
  14. 电脑和ubuntu开发板用网线连接的方法
  15. 计算机专业专硕考研学校排名,计算机考研学校排名
  16. 完完整整地看完这个故事,你敢说还不懂Docker?
  17. 《乐队的夏天》刺猬乐队下半年音乐节巡演时间表
  18. (转)帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
  19. 我看了《2018 微信数据报告》,你呢?
  20. 图像采集数据集整理和扩充方案(含代码)

热门文章

  1. 笔记-项目风险管理-风险的分类
  2. 怎么使用华为三层交换机实现不同vlan之间设备的通信
  3. html计数器自动编号,如何使用CSS计数器自动为元素进行编排
  4. 名著赏读 | 今天,来立一个flag吧!
  5. Probe Request
  6. python调用sql数据库进存销_python多进程快速批量爬取黄页海量信息并保存文本和数据库教程...
  7. 数据库应用系统的需求分析
  8. Linux定时重启服务脚本
  9. 提词器软件都有哪些?这几种提词器使用起来很方便
  10. 利用JavaScript对HTML和CSS实现简单的动态操作