教学大纲


一、高教版《数据结构》

图的概念有点多,在此只讨论最基础的内容,所以选择比较薄的高教版《数据结构》。

1.4 非线性数据结构--图
1.4.1 图的基本概念
1.4.2 图形结构的物理存储方式
1.4.2.1 相邻矩阵
1.4.2.2 图的邻接表示
1.4.2.3 图的多重邻接表示
1.4.3 图形结构的遍历
1.4.4 无向连通图的最小生成树(minimum-cost spanning tree:MST)
1.4.5 有向图的最短路径
1.4.5.1 单源最短路径(single-source shortest paths)
1.4.5.2 每对顶点间最短路经(all-pairs shortest paths)
1.4.6 拓扑排序

二、网络资源

涉及到的内容:数据结构之图【还可以的大纲】

不错的教学视频:5 1 图的基本概念

三种表达

From: https://www.cs.usfca.edu/~galles/visualization/DFS.html

    • Logical Representation
    • Adjacency List Representation
    • Adjacency Matrix Representation

“普通”邻接表示

struct node{
  bool mark; //访问标志
  char letter; //顶点数据域
  struct edge *out; //指向边表的指针
};
struct edge{
  bool mark; //访问标志
  int no; //顶点编号
  struct edge *link; //指向边表的后继
};

多重邻接表示

表节点存储的不是顶点的序号,而是指向边(或者说弧)另一端相邻顶点的指针。

struct node{
  bool mark; //访问标志
  char letter; //顶点数据域
  struct node *nextnode; //指向图顶点集合中下一个元素的指针
  struct arc *out; //指向该顶点边表的指针
};
struct arc{
  bool mark; //访问标志
  struct node *link; //指向该弧(边)的另一端顶点的指针
  struct arc *nextarc; // 指向与该顶点连接的其余弧(边)的指针
};

看上去特别像倒排表:[IR] Inverted Index & Boolean retrieval

图的遍历

一些概念

连通:如果从v到w存在一条(无向)路径,则称v和w是连通的

路径:v到w的路径是一系列的顶点的集合,其中任一对相邻的顶点间都有图中的边。路径的长度是路径中的边数(如果带权,则是所有边的权重和)。如果v和w之间的所有顶点都不同,则称简单路径(无回路)

回路:起点等于终点的路径

连通图:图中任意两顶点均连通

连通分量:无向图中的极大连通子图

强连通;有向图中顶点v和w之间存在双向路径(既有从v->w又有从w->v,可以不是同一条),则称v和w是强连通

弱连通:去掉方向后的v和w是连通的

强连通图:有向图中任意两顶点均强连通

强连通分量:有向图的极大强连通子图

遍历实现

不同的起点,会导致不同的遍历路径,也就生成了不同的“生成树”。

    • 深度优先(depth-first search:DFS)
    • 宽度优先(breadth-first search:BFS)

Depth First Search, DFS

Breadth First Search, BFS

广度优先搜索六层,就是“六度空间” 问题。

图的优化问题

"无向连通图" 的最小生成树(minimum-cost spanning tree:MST)

既然从不同的顶点出发会有不同的生成树,而 n 个顶点的生成树有 n-1 条边,那么,当边带权的时候(网络),如何寻找一个(网络中)的最小生成树(即树中各边权值之和最小)?

以下内容具体参见:[Optimization] Greedy method

稠密图的贪心算法:Prim算法

从一个点一点一点向外扩张延伸,进入树内的点的dist都为0,往外延伸时是与树中任意一个结点距离最小

选择整个树周边的“最小的边”。

稀疏图的贪心算法:Kruskal算法

每次从剩余所有边中取最短的边,所选边不能构成回路

最小堆:查找最小的边

并查集:要连接的俩点不在同一棵树上。Goto: 超有爱的并查集

并查集的实现,int pre[1000]; 这个数组,记录了每个大侠的上级是谁。大侠们从1或者0开始编号(依据题意而定),pre[15]=3就表示15号大侠的上级是3号大侠。

如果一个人的上级就是他自己,那说明他就是掌门人了,查找到此为止。也有孤家寡人自成一派的,比如欧阳锋,那么他的上级就是他自己。每个人都只认自己的上级。比如胡青牛同学只知道自己的上级是杨左使。

张无忌是谁?不认识!要想知道自己的掌门是谁,只能一级级查上去。

路径压缩,每个人通过指针在某一处查询自己门派的头儿。如果join有门派合并事件,则只修改门派的头儿即可。

有向图的最短路径

单源最短路径(single-source shortest paths)Dijkstra算法 (基于贪心算法)

Dijkstra算法和 最小生成树Prim算法最小生成树算法非常类似,大家可以先熟悉下个算法。两个算法都是基于贪心算法。

虽然Dijkstra算法相对来说比Bellman-Ford 算法更快,但是不适用于有负权值边的图,贪心算法决定了它的目光短浅。

而Bellman-Ford 算法从全局考虑,可以检测到有负权值的回路。

Ref: Dijkstra算法(一)之 C语言详解

核心思路

与S集合中相邻的点中找到最小的(“边”+相邻点的“值”),然后更新俩集合即可。

如果edge存在负数,则会破坏以上这句话背后的原则。

时间复杂度:O(E+V*logV)

基本思想

指定起点s (即从顶点s开始计算)。

S:记录已求出最短路径的顶点 (以及相应的最短路径长度);

U:记录还未求出最短路径的顶点 (以及该顶点到起点s的距离);

初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶的路径是"起点s到该顶点的路径"。

然后,从U中找出路径最短的顶点,并将其加入到S中;

接着,更新U中的顶点和顶点对应的路径。

然后,再从U中找出路径最短的顶点,并将其加入到S中;

接着,更新U中的顶点和顶点对应的路径。 ... 重复该操作,直到遍历完所有顶点。

操作步骤

(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。

(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。

(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

(4) 重复步骤(2)和(3),直到遍历完所有顶点。

每对顶点间最短路经(all-pairs shortest paths)Floyed算法 (基于动态规划)

Ref: Floyd 算法求多源最短路径

Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,

    • 既可以是无向图也可以是有向图,边权可以为负。
    • 但是不能存在负环 (可根据最小环的正负来判定)。

More details, please check : [Optimization] Dynamic programming

    /* 其他内容,再补充 */

End.

[Algorithm] Graph的更多相关文章

  1. [Code] 烧脑之算法模型

    把博客的算法过一遍,我的天呐多得很,爱咋咋地! 未来可考虑下博弈算法. 基本的编程陷阱:[c++] 面试题之犄角旮旯 第壹章[有必要添加Python] 基本的算法思想:[Algorithm] 面试题之 ...

  2. cvpr2015papers

    @http://www-cs-faculty.stanford.edu/people/karpathy/cvpr2015papers/ CVPR 2015 papers (in nicer forma ...

  3. 最短路径树:Dijstra算法

    一.背景 全文根据<算法-第四版>,Dijkstra算法.我们把问题抽象为2步:1.数据结构抽象   2.实现 二.算法分析 2.1 数据结构 顶点+边->图.注意:Dijkstra ...

  4. algorithm@ Shortest Path in Directed Acyclic Graph (O(|V|+|E|) time)

    Given a Weighted Directed Acyclic Graph and a source vertex in the graph, find the shortest paths fr ...

  5. 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法

    1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...

  6. Graph Algorithm

    1.定义 A graph consists of a set of vertices V and a set of edges E. Each edge is a pair (v, w), where ...

  7. Root :: AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 7. Graph Algorithms and Implementation Techniques

    uva 10803 计算从任何一个点到图中的另一个点经历的途中必须每隔10千米 都必须有一个点然后就这样 floy 及解决了 ************************************* ...

  8. [Algorithm] JavaScript Graph Data Structure

    A graph is a data structure comprised of a set of nodes, also known as vertices, and a set of edges. ...

  9. LeetCode Algorithm 133_Clone Graph

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

随机推荐

  1. OSPF但区域配置

    原理概述 实验内容 实验拓扑 实验编址 实验步骤1.基本配置配置完成后,使用ping命令检测 2.部署单区域OSPF网络使用命令ospf创建并运行OSPF 其中1是进程号,如果没有写明进程号,则默认为 ...

  2. ELK-Elasticsearch 基础使用

    一.基本概念 1 Node 与 Cluster Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例.单个 Elastic 实例称为一个节点( ...

  3. C#锁对象代码

    private static readonly object SequenceLock = new object(); private static readonly object SequenceL ...

  4. C# 上传大文件

    上传大文件首先要修改web.config文件,否则上传报错.在web.config添加如下配置maxRequestLength表示能上传的最大文件值,单位是KB,requestLengthDiskTh ...

  5. Yarn (转自之乎者也)

    作者:青俞链接:https://www.zhihu.com/question/34016617/answer/57822812来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  6. react编写规范之组件组件的内容编写顺序

    static 开头的类属性,如 defaultProps.propTypes. 构造函数,constructor. getter/setter(还不了解的同学可以暂时忽略). 组件生命周期. _ 开头 ...

  7. 基于麦克风阵列的声源定位算法之GCC-PHAT

    目前基于麦克风阵列的声源定位方法大致可以分为三类:基于最大输出功率的可控波束形成技术.基于高分辨率谱图估计技术和基于声音时间差(time-delay estimation,TDE)的声源定位技术. 基 ...

  8. Windows 2008R2 安装PostgreSQL 11.6

    前些天在CentOS 7.5 下安装了PostgreSQL 11.6.除了在无外网环境下需要另外配置之外,其他没有什么差别.今天主要写一下在Windows下面安装PostgreSQL的问题. 在官网看 ...

  9. windbg自行下载的sos.dll存放路径“..\SOS_x86_x86_4.7.3132.00.dll\5B5543296ee000\”里的“5B5543296ee000”是什么?

    问题的引出 我在调试某个崩溃问题时,要跟踪clr的栈,于是,我先执行了指令.loadby sos clrjit,没有报错,然后我又执行!clrstack,结果却有如下输出:0:000:x86> ...

  10. 如何用Windbg从dump获取计算机名、主机名

    对内存转储时发生的事情有一定的了解是非常重要的.这有助于您确定要执行哪些WinDbg命令,并为您提供一些有关如何解释这些命令输出的上下文.我正在查看一个服务器的内存转储,该服务器存在性能问题.我在内存 ...