关于图的顶点染色问题的各种算法的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)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
随机推荐
- CTF入门指南(0基础)
ctf入门指南 如何入门?如何组队? capture the flag 夺旗比赛 类型: Web 密码学 pwn 程序的逻辑分析,漏洞利用windows.linux.小型机等 misc 杂项,隐写,数 ...
- Java 判断回文字符串有多少和其中的最大字符串
一.简介代码功能 该代码的功能可以实现对任意的一段字符串进行判断是否有回文,回文有哪些,和其中的最大回文. 二.代码部分 1.全局变量 static String hws = "" ...
- Linux查看网络端口
简单的总结一下前段时间学习Linux的成果 查看 TCP 22 端口是否打开1.列出所有端口:[root@Demon proc]# netstat -ntlpActive Internet conne ...
- 通过VMware安装Linux操作系统
1.安装好vmvare,下载好Linux,本文采用redhat 6.5 (下载linux可参考http://www.linuxidc.com/Linux/2007-09/7399.htm) 2.选择 ...
- iOS数据本地化
本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...
- 对GPIO_Init(GPIOx,&GPIO_InitStructure)的理解
今天学习stm32流水灯程序的时候,看到了"GPIO_Init(GPIOB, &GPIO_InitStructure)"这个函数,参数1"GPIOB"很 ...
- CF #April Fools Day Contest 2016 E Out of Controls
题目连接:http://codeforces.com/problemset/problem/656/E 愚人节专场的E,整个其实就是个Floyd算法,但是要求代码中不能包含 definedoforfo ...
- DirectFB 之 环境配置
1. 准备 directFB下载地址:http://www.directfb.org/index.php?path=Main%2FDownloads 本人采用的版本是DirectFB-1.5.3.ta ...
- J2EE struts2MVC应用在线书签1
序:之前花了一天研究了一下filter,虽然是实现了MVC模式开发了 WebBookmark,但是代码过于冗长,集中在filter中使用if语句不易阅读,为了体现两份作业的不同点,我决定学习 Java ...
- 解决初次使用webpack+antd-mobile时css不生效的问题
前端这块,最火的是angular.react.vue.根据你具体的业务场景,选择合适的框架或者类库.以react为例,新建一个项目时, css组件按钮,图片轮播等组件,最好不要重复造轮子,选择业内规范 ...