我是一个数学工作者,专业方向是图论。研究图论已经十年有余。一个月前,一个偶然的机会让我萌生了一个念头,那就是我想尝试用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. php基础知识(二)---2017-04-14

    1.字符串的三种表达形式: (1)双引号 (2)单引号 (3)尖括号 $s = <<<A <div style="width:500px; height:100px; ...

  2. J2SE之基础语法总结一

    1.标识符: (1)简单来说凡是可以起名字的地方都叫标识符,起标识符的时候要见名知意. (2)标识符由字母.数字.美元符$和下划线组成,标识符应以字母.下划线.$开头,注意不能以数字开头. (3)ja ...

  3. [洛谷P2580]于是他错误的点名开始了

    洛谷P2580的一个水题,用啥都能过,不过为了练习一下刚刚学会的字典树,还是认真做一下吧. #include <cstdio> #include <cstring> using ...

  4. struts2 之 struts2数据校验

    1. 数据校验一般分为2类:前端的校验(js校验),后端的校验(java代码):实际开发中大部分情况下都是采用js校验.在对数据安全要求较高的情况下可能会采用后端验证. 2.  Struts2提供了后 ...

  5. http协议的八种请求类型

    GET:向特定的资源发出请求. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源的创建和/或已有资源的修改. OPTIONS: ...

  6. js 不要使用new

    (1)不要使用new Array(),new Number, new String, or new Boolean. 等等 如果要新建数组,没有必要使用new Array(),使用[];原因是直观. ...

  7. CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序

    题目链接:http://codeforces.com/contest/655/problem/D 大意是给若干对偏序,问最少需要前多少对关系,可以确定所有的大小关系. 解法是二分答案,利用拓扑排序看是 ...

  8. 《HelloGitHub》第 13 期

    公告 本期推荐的项目到达了 30 个,里面少不了对本项目支持的小伙伴们,再次感谢大家. 本次排版尝试:根据分类项目名排序,为了让大家方便查阅.如果有任何建议和意见欢迎留言讨论 临近 5.1 假期,所以 ...

  9. @JsonIgnoreProperties注解不起作用的问题解决

    最近做的一个东西要调第三方服务接口,要参照接口文档开发,但是第三方服务的接口字段名全部都是大写,本来以为这种应该没有什么问题.但是实际开发中发现大写的字段名字去调后台接口的时候报: org.codeh ...

  10. macOS 下配置 MAMP 开发环境(Mac + Apache + Mysql + PHP)

    macOS 中已经内置了 PHP.Python.Ruby.Perl 等常用的脚本语言,以及 Apache HTTP 服务器,所以使用起来非常方便.本文以最新的 macOS Sierra 10.12 配 ...