图的定义
简单来说,图 就是一个结点的集合 和边的集合 ,其中任意一条边都可以表示为两个结点之间的关系。
有向边与无向边
如果边对结点的关系是双向的,那么这条边是无向边;如果是单向的,那么这条边是有向边。
图是怎么存的,get到以下几种做法。
1.临接矩阵
(二维的数组,s[i][j]表示i点与j点的距离。)
但显然需要占用很大多余的空间。对于一个稀疏的图(边相对于点数的平方比较少)来说,用邻接矩阵来存的话,成本偏高。
2.邻接表
采用邻接表就可以很大程度的节约空间
常见的两种的写法
一
s[i][1]=j;
s[i][2]=p; 表示i与j,p之间分别存在一条边。
二
vector adj[i]用来存以i为始点的边
但用vector无法科学的删除,因此常用 list。
它的特点是可以用来按顺序访问一个结点的出边(或者入边)??
一些跟图有关的定义
路径
path,是指一个边的序列,其中的边首尾相连。
简单路径
simple path,是每条边只经过了一次的路径。
回路
cycle,也称为 环 ,是起点和终点相同的路径。
简单回路
图的定点序列中,除了起点和终点相同外,其余顶点不重复的回路。
连通
两个点连通
无向图中点 和 连通是指存在一条 到 的路径。
图连通
如果无向图 中任意两个节点连通,称其为是连通的。
路径的长度
一般来说,路径的长度在数值上等于路径的边数,或者如果边是带权的,则是路径的边权和。
由此引出我们常见的图论问题。
《最短路径》问题
两个节点之间最短的路径;
注:不一定存在,不一定唯一。
解决最短路径问题介绍两种 算法:
Floyd 算法
是用来求任意两个结点之间的最短路的。
复杂度比较高,但是常数小,容易实现。但采用了三个for循环,当数据达到1e3时已经超时
适用于任何图,不管有向无向,边权正负,但是最短路必须存在。(不能有个负环)
代码实现
for (k = 1; k <= n; k++) {
for (i = 1; i <= n; i++) {
for (j = 1; j <= n