关于图的顶点染色问题的各种算法的C++实现之初探(一)——引言与简介
我是一个数学工作者,专业方向是图论。研究图论已经十年有余。一个月前,一个偶然的机会让我萌生了一个念头,那就是我想尝试用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++实现之初探(一)——引言与简介的更多相关文章
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- 图的最短路径——dijkstra算法和Floyd算法
dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...
- java数据结构_附12_图、顶点和边的定义(双链存储)
图--双链式存储结构 顶点 和 边 的定义 1.Vertex.java 2.Edge.java 3.AbstractGraph.java 1. public class Vertex {private ...
- 输出图中顶点i到顶点j之间的所有简单路径
简单路径(不包括环) DFS遍历以及回溯得到结果 void dfs(ALGraph graph, int v, int end, bool visit[], int path[], int cnt) ...
- [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算
1 前言 略,作为记录使用 2 代码 /** * @Author: FB * @Description: * @File: RotateSample.go * @Version: 1.0.0 * @D ...
- 图的全局最小割的Stoer-Wagner算法及例题
Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: --------------------------- ...
- 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))
sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个有向图 ...
- javascript实现有向无环图中任意两点最短路径的dijistra算法
有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...
- 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
随机推荐
- 20170410Linux备课资料 --- 压缩与解压缩
这节课我们来学习一下压缩与解压缩,那什么是压缩与解压缩呢? 联想一下Windows系统: 选中文件,右键选择即可 如果压缩,可以选择要压缩的格式,而解压缩直接选择就可以完成了 Linux是通过命令的方 ...
- 课堂博客-----TreeView+++++XML形成博客
什么是XML? 解析:XML:Extensible Markup Language(可扩展标记语言) HTML:HyperLink Text Markup Language(超文本标记语言) xml ...
- folly教程系列之:future/promise
attension:本文严禁转载. 一.前言 promise/future是一个非常重要的异步编程模型,它可以让我们摆脱传统的回调陷阱,从而使用更加优雅.清晰的方式进行异步编程.c++11中 ...
- 关于string类型定义占几个字节??
测试代码: #include <iostream>using namespace std;int main(void){ string name; cout<<"si ...
- R语言写2048游戏
2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结束. 编程时并未查看原作者代码,不喜勿喷. 程序结构如 ...
- SIP DB33标准笔记 注册/目录发送/心跳
SIP协议扩展中: 在 RFC 3261 基础上定义了一个新方法 DO.方法 DO 的功能包括:控制对方动作.更新对方信息.查询对方状态.历史监控资料查询和回放等.发送方法 DO 的请求报文时,不会创 ...
- 数据库问题(程序连接mysql错误)
今天服务器遇到了一个很熟悉的问题 输入 #mysql -u root -p ERROR 2002 (HY000):Can't connect to local MySQL server 随即上网找寻答 ...
- Extjs6组件——Form大家族成员介绍
本文基于ext-6.0.0 一.xtype form一共有12种xtype,下面来一一举例说一下. 1.textfield 这个是用的最多的form之一. { xtype: 'textfield', ...
- JS作用域就这么几句话
JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...
- OSI七层模型学习笔记
1.简介 什么是OSI模型呢? OSI模型全名Open System InterConnect 即开放式系统互联,是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架, ...