我是一个数学工作者,专业方向是图论。研究图论已经十年有余。一个月前,一个偶然的机会让我萌生了一个念头,那就是我想尝试用C++写出我所学过的图论方面的算法。作为一个数学工作者,过去一直是纸上谈兵,我之前并没有真正写过多少程序。确实,只知道写证明的纯理论的数学工作者往往自视甚高地看不起工程中实际写程序的程序员(即使程序员圈子里也有不少厉害的数学工作者),另一个方向的鄙视链好像也一定程度上存在着。于是,我不想只作一个“思想上的巨人行动上的矮子”,便有了这个系列的博客。

首先声明,我不是专业的程序员,只是大学里教数学的一个教书匠。程序写得不好还请诸位指教。另一方面,工作上压力也蛮大,有不少教学工作和论文方面的工作。所以我的博客可能无法定期更新。

然后说说我们的主要目标。目前我的目标是写一下有关“图的顶点染色”方面的算法,如果我足够“有毅力”可以坚持下去的话(其实,之前也想做这件事情,后来都慢慢放弃了),将来看情况再写写其他方面,甚至于纯粹的离散数学方面的内容。下面开始正题。

(一)图论和顶点染色的相关简介。

图论的研究对象是“”,我们在数学上一般用G,H,F这几个字母表示。设G是一个图,一般认为G有两部分组成,分别是顶点集V(G)和边集E(G),它们有时也简写作V和E,因而有时也将图G更准确地表示为G(V,E)。画在纸上看,一般是用小圆点表示图的顶点,而用连接两个小圆点的线表示边。实际上,这恰恰暗示着图G还有隐含的第三个部分,那就是顶点和边的关联关系,一般说,边e与顶点u和v相关联,直观上看,就是图上有一条线e将顶点u和v相连。由于这些“线”实际上只是体现逻辑上的关联关系,所以这些具体的画法一般没有什么要求,当然笔者专业的拓扑图论以及和图论有些沾边的“组合几何学”(几何图论)有些例外,一般情况下是不做要求的。

设e是一个边,它关联的两个顶点是u和v,则称u和v是它的两个端点,并且称u和v是相邻的。如果u=v,那么我们称这个边e是一个loop(国内中文书里翻译这个loop有好几种名字,为了不造成混乱,涉及学术名词时,我尽量保持英文表述,除非中文已经有了确切的约定俗成)。如果关联着u和v的边不只一条,那么我们就称这一组边是一组平行边(也叫重边)。如果一个图没有平行边也没有loop,那么我们就称这种图是一个简单图(simple graph)。

下面说一下顶点染色。考虑图G(V,E)。设c是一个从V到集合{1, 2, ... , k}的映射(如果“映射”这个词你听起来不习惯,也可以把它换成“函数”,完全没毛病),那么我们就说c是图G上的一个k-顶点染色,简称k-染色(k-colouring),c的像集(或者说值域){1, 2, ... , k}中的每个数字都叫做这个染色所用的颜色。如果进一步地,染色c能保证:任何边不会连接颜色相同的顶点,那就说这个染色c是好的(proper)。

设c是图G的所有好的染色中颜色个数最少的一个,那么就说c是G的最优的顶点染色,并且称c所用的颜色个数是G的色数(chromatic number),记作χ(G)。求图G的色数的问题就是“图的顶点染色问题”。

(二)游戏怎么玩?

1. 从图的顶点染色的定义可以看出,平行边的存在在染色问题中是没有意义的,而loop的存在在染色问题中是致命的。所以,我们在染色问题中只考虑简单图

2. 我们的程序需要用各种算例来检验,我将把这些算例用文本文件的形式存储。每个算例都是一个随机图,它的每条边的存在性由一个指定的概率给出,换言之,这个图的边集是等概率的。所以我们首先需要一个生成随机图的程序,这个程序将在下一篇中给出,要求是输入两个参数,一是图的顶点数,二是每条边出现的概率。这两个参数能控制图的稠密程度,一般来说,图越稠密顶点染色的程序的实际耗时很可能越大,所以它们将是十分重要的参数。

3. 以后的算法中会出现其他一些概念,由于涉及图论概念可能很多,所以我将不会一次性写完,而是每次只写这一篇所需要的概念。并在文章结尾处留下本篇所涉及者。

(三)本篇所列概念(依照出现次序)

图;顶点集V(G);边集E(G);关联关系;

端点;相邻的顶点;loop;平行边,重边;简单图;

k-顶点染色,k-染色;颜色;好的染色;

最优的顶点染色;色数χ(G);图的顶点染色问题。

关于图的顶点染色问题的各种算法的C++实现之初探(一)——引言与简介的更多相关文章

  1. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  2. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  3. java数据结构_附12_图、顶点和边的定义(双链存储)

    图--双链式存储结构 顶点 和 边 的定义 1.Vertex.java 2.Edge.java 3.AbstractGraph.java 1. public class Vertex {private ...

  4. 输出图中顶点i到顶点j之间的所有简单路径

    简单路径(不包括环) DFS遍历以及回溯得到结果 void dfs(ALGraph graph, int v, int end, bool visit[], int path[], int cnt) ...

  5. [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算

    1 前言 略,作为记录使用 2 代码 /** * @Author: FB * @Description: * @File: RotateSample.go * @Version: 1.0.0 * @D ...

  6. 图的全局最小割的Stoer-Wagner算法及例题

    Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: --------------------------- ...

  7. 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))

    sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个有向图 ...

  8. javascript实现有向无环图中任意两点最短路径的dijistra算法

    有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...

  9. 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

随机推荐

  1. Intellij IDEA2016 注册码

    网上大多数关于Intellij IDEA2016的注册码多是同一个,如下 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1l ...

  2. Ubuntu 16.04系统下安装PHP5.6*

    Ubuntu 16.04系统默认php7,并没有php5*的包,所以需要自己安装: 方法: 1.删除所有的php包列出安装的php包,dpkg -l | grep php| awk '{print $ ...

  3. 卷积神经网络CNN公式推导走读

      0有全连接网络,为什么还需要RNN 图像处理领域的特殊性,      全连接网络缺点:                              RNN解决办法:      1参数太多       ...

  4. vscode同步设置&扩展插件

    首先安装同步插件: Settings Sync 第二部进入你的github如图:  打开设置选项: 新建一个token: 如图:  记住这个token值 转到vscode 按shift+alt +u ...

  5. python——面向对象相关

    其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 class Foo(object):     pass   obj = Foo( ...

  6. EverythingAboutJava

    1 GC gabage collection 垃圾回收Java GC系列(1):Java垃圾回收简介 http://mp.weixin.qq.com/s?src=3&timestamp=149 ...

  7. java 无法连接ftp服务器(500 OOPS: cannot change directory)

    在使用java连接ftp服务器时可能会出现无法连接的情况,检查代码是没有错误的,这时就应该考虑一下服务器端的情况了: 首先用在本地打开命令窗口,输入:ftp ftp服务器IP,窗口会提示你输入用户名密 ...

  8. 【转】为什么delete以后指针还能被赋值

    首先,系统知道哪一部分堆的线性空间被占掉了,new就是起这个作用,仅仅是声明一下(可能多了一个功能),因为堆的空间不一定是直接从系统调用获得的,堆的空间是这样管理的:程序先伸请一个大的堆空间,这个时候 ...

  9. ObjectARX自定义实体的最近点和垂点捕捉算法

    最近点用pickPoint来计算,垂点用lastPoint计算. 一般AcDbCurve类可以用AcGe类的 getClosestPointTo 来实现计算需要的点值. 下面是代码示例: case A ...

  10. CSS清除浮动各种方法

    当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外面而影响(甚至破坏)布局的现象.这个现 ...