一、若干定义。

      图(graph)、顶点(Vertex)、边(Edge)等一些基础概念: 

1、图:一个图( graph ) G = (V , E)是由顶点( vertex )和边( edge )的集合E所组成的,其中的V即顶点的集合,E即边的集合。

      2、边:在图中,一条边由图中顶点集中的两个点v, w组成,这两个点被描述为点对(v, w),这个边有时候也被称作弧( arc )

3、有序和有向:   先介绍点对(v, w)有序的概念:即(v, w)和(w, v)为两个不同的点对,图论中点的有序类似于数学中向量前后的两个点,这时候由这两个点组成的边是有向的,进而整个图就是有向的( directed )。具有有向性质的图被称作有向图( digraph)。

      4、邻接顶点:顶点v和w邻接( adjacent)当且仅当( v, w)∈E,即当两个顶点v, w之间存在边时两个点邻接。

  5、权(值):边有时具有第三种性质,即权( weight )或者 值(cost),即边具有长度。

    路径( path ):

1、路径是一个顶点序列 w1, w2, w3, w4……,wn,其中的在路径上处于相邻位置上的定点对(wi, wi+1)邻接,即(wi,wi+1)∈E,路径的长为路径上边的数目,即N - 1

2、环:在路径中从一个顶点回到该顶点也可作为一条路径,在路径不包含边的时候,路径的长为0.若(v, v)的所有路径中存在大于0的路径,则此路径称为环( loop)。

3、简单路径:在简单路径上,其上的所有顶点互异,但最后一个顶点可能相同。部分的环也属于简单路径。在路径中间不穿过中间顶点的路径为简单路径。

4、圈:圈是有向图中特有的概念。圈是满足w1 = w N且长至少为1的路径。

                          简单圈:满足圈的路径是简单路径,则这个圈是简单圈。

5、边的互异:对于边(v, w)。在无向图中,要求边是互异的,即在边的集合中,不能存在边(v, w)的同时存在边(w,v)。而在有向图中则可以,即(v, w)与(w, v)是两条不同的边。

  思考:对于路径(w, v, w),在前提w,v都是边的情况下,其是否是圈。 由上面的定义,在无向图中,由于边(v,w)和边(w,v)为同一条边,则在无向图中其不是圈,而在有向图中是。

6、无圈的:若一个有向图中没有圈,则其是无圈的(acyclic)。

      连通(Connect):

               1、连通的强连通的:若在图中存在每一个顶点到每个其他顶点的路径,具有这种性质的无向图中是连通的,具有这种性质的有向图是强连通的(strongly connected)。

               2、基础图(underlying graph): 有向图去掉边上的方向形成的无向图。

               3、弱连通的(weakly connected):若有向图的基础图是连通的,则称该有向图是弱连通的。

               4、完全图(complete graph):每一对顶点间都存在一条边的图。

二、图的表示。

方法一、邻接矩阵(adjacent matrix).

该方法通过声明一个二维数组A,对于顶点对(u, v),若(u, v)边存在边,则A[u][v] = 1,否则数组的元素为 0。对于存在权的边,我们可以让A[u][v]=weight,同时使一个很大或者很小的权表示不存在的边。

优缺点分析:优点是十分简单,缺点也很明显:空间需求为Θ ( | V | ²),在图是稠密的(dense)的情况下,此时|E| = Θ(|V|²),此时表示就很合适,然而,在大多数情况若图中不是边的顶点对很多的话,就会对空间造成非常大的浪费。

在图是稀疏(sparse)的情况下,更好的方法则是采用邻接表(adjacency list)。

方法二、邻接表(adjacency list):

邻接表是表示图的基本方法,类似于散列的分离链接法,邻接表是一个结构体数组,其中的每个结构体又包含指向下一个结构体的指针,即每数组中的每一个结构体都作为表头单独形成一个链表。在考虑具体如何实现邻接表之前,我们应当考虑我们应该如何安排每一个顶点以及边。

对于每一个顶点,它具有着与其他顶点相连,那么我们应当保存的数据有与其相邻的所有的顶点,以及在该顶点处存储的元素。

那么如何存储顶点的信息?我们给出的方法是对每一个顶点,我们都在顶点处保存有该点的内部信息,即从0到N-1依次为顶点分配编号,并且这个内部的编号是不可见的。

之后我们应当考虑的要点是如何存储所有与其相邻的顶点。在开始我们便已经提到了,该邻接表的存储方式与散列的分离链接法类似。那么我们可以先从每个点进行分析,那么对于N个点来说,我们对于每个点都需要以同样的方式存储所有与该点相邻的顶点,那么我们可以规定数组的大小为N,让每一个顶点通过其内部编号与数组下标相对应的关系,让其作为数组中的元素进行存储。然而,如果这样的话,我们将无法存储与其相邻的点。因此,更好的方法是每一个数组元素内存储一个结构体体,这个结构体包含该顶点的数据信息以及指向(存储着与它相邻的)顶点的结构体。

由于在单个链表,即对于数组中的单个结构体所生成的链表中,其除表头外的每一个结构体都存储着与表头中所存储的顶点相连的节点,那么这两个顶点间有一条边。那么链表中也应当存储关于这个边的信息,在无权图中自然没有必要,然而在有权图中,我们就会增加一个存储该权值的数据信息。那么总结一下:该结构体存储的有:与顶节点邻接的顶点的内部编号、该顶点处的数据信息,以及该顶点与表头中存储顶点之间边的权值。

                       这样一来,我们对于邻接表的实现算是初步完成了。

以下是C语言实现:

#define MaxVertexNum 100
typedef int ElementType;
typedef int Vertex;
typedef int WeightType;
typedef struct VertexNode {          //头节点PtrToAdjVNode FirstVertex;         //第一个与它相邻的顶点ElementType Element;               //顶点信息
}AdjList[MaxVertexNum];
typedef struct GraphNode* PtrToGNode;//指向图的指针
struct GraphNode                     //图
{int NumofVertex;                 //顶点的数目int NumofEdge;                   //边的数目AdjList G;                       //邻接表G
};
typedef struct AdjVNode* PtrToAdjVNode;
struct AdjVNode {//出了头节点外的节点Vertex AdjV;   //顶点的内部编号ElementType Element;//顶点信息WeightType Weight;  //到头节点处的边的权PtrToAdjVNode Next; //下一个节点
};

                  

图论算法 若干定义相关推荐

  1. warshall算法求传递闭包c++_【建模小课堂】图论算法

    图论算法 图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式.很多问题都可以转化为图论问题,然后用图论的基本算法加以解决.这类问题算法主要包括Dijkstra ...

  2. 数据结构和算法:第八章 图论算法

    9.1 若干定义 图的定义:一个图(Graph) G=(V,E)是由顶点的集合V和边Edge的集合E组成的.每一条边就是一个顶点对(v,w),其中(v,w) ∈E.有时候也把边叫做弧.如果顶点对是有序 ...

  3. 图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )

    一.Dijkstra算法 问题描述:求一个点到任意个点的距离 思路:单源最短路径问题,使用Dijkstra算法 Input: 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 ...

  4. 图论算法——图的遍历

    图论算法也是非常基础且重要的算法(ps:好像没有不重要的......) 图的基本应用--图的遍历,从具体的题目着手,学习图的遍历方式及代码形式. 我们先来看一下题目,然后再具体分析图的遍历方式. 题目 ...

  5. 算法模型是什么意思,算法模型定义介绍

    算法模型定义介绍 1.马尔科夫模型 1.1马尔科夫过程 马尔可夫过程(Markov process)是一类随机过程.它的原始模型马尔可夫链.已知目前状态(现在)的条件下,它未来的演变(将来)不依赖于它 ...

  6. 【liuyubobobo-玩转图论算法】第一章 课程概述

    持续学习&持续更新中- 守破离 [liuyubobobo-玩转图论算法]第一章 课程概述 图论概述 课程特色 课程大纲 图论的应用 参考 <玩转数据结构>是<图论课程> ...

  7. 图论算法小结:网络流及其算法

    个人说明:最近学到了图论算法,但网络流这部分颇难理解,于是在网上找到了一片比较好的讲解博客.转载之~ 网络流(Network Flow) 将每条有向边想象成传输物质的管道.每个管道都有一个固定的容量, ...

  8. 图论算法:图论基础介绍

    图论相关定义 一个图(graph) G = (V, E) 由顶点(vertex)的集合 V 和 边(edge)的集合E组成,有时也把边称作弧(arc).如果图中的边是带方向的,那么图就是有向图(dir ...

  9. NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...

  10. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

最新文章

  1. 如果你能用你的大脑控制电脑,感觉怎么样?
  2. java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)
  3. python爬取地理数据_python爬取所有人位置信息——腾讯位置大数据
  4. html文件上传删除,文件上传以及删除文件方法
  5. 复习Linux基础操作---权限操作
  6. android属性动画缩放和平移同时,Android 实现属性动画平移,旋转,缩放,渐变 《H》...
  7. 蔚来与雷蛇联合推出NIO ES6限量版车型 售价46.78万元
  8. R语言自定义设置使用内存的大小、可以使用的内存范围?
  9. 修改 exchange服务器,升级Exchange2010-新服务器更改IP
  10. oracle中to_number字符串转数字、max取最大值、dbms_random.value生成随机数及对小数做截取,四舍五入操作的函数
  11. html广告倒计时代码,jquery实现可关闭的倒计时广告特效代码
  12. 谷歌浏览器好用的插件
  13. Java项目实战【超级详细】
  14. 双向搜索(bfs,dfs)
  15. HTML批量转换jpg,万能文件转换工具(word,excel,powerpiont,PDF,TXT,JPG,HTML互转)
  16. 奇迹按键精灵挂机脚本_奇迹脚本代码导入按键精灵后怎么使用?
  17. C#通过注册表查看电脑是否安装office或office版本
  18. 第二代计算机主要应用领域转为____.,计算机应用基础知识2解答.doc
  19. OSS 配置url浏览模式
  20. Android无法安装apk,8.0未知来源应用安装权限

热门文章

  1. Kibana:Drilldown 中的 URL 模板
  2. RGB色彩模式与CMYK色彩模式参数转换公式
  3. Halcon识别激光雕刻二维码_ZCTMV
  4. 苹果的产品开发流程介绍:带你认识世界最好的设计公司
  5. 自定义控件:Flag标签
  6. Linux如何自定义屏幕分辨率,Linux手动设置屏幕分辨率的办法
  7. mongodb使用csv导入导出
  8. 线性代数笔记2:基本子空间的正交性及性质
  9. JTT808、JTT1078、TJSATL主动安全踩坑记录
  10. 影像数据库 | ADNI数据下载/分析