一、基础概念:
①、图的定义:
点和边的集合
②、边的方向:
边具有方向则为有向边,图中边有方向则为有向图;边不具有方向则为无向边,图中边没有方向则为无向图;
③、边的权值:
为边所有的属性,可以具象化为路径的长度,或路径花费时间、或飞机的机票价格;边可为负数。
④、点的度:
度为该点与几条边相连。有向图的点的度分为出度和入度,度总是为出度+入度;
二、图的存储
①邻接矩阵:
本质上是二维矩阵,有向图的邻接矩阵的横坐标为边出发点,纵坐标为边的终点,矩阵中存的是该边权值;而对于无向图而言需要同时反向再存储一次。
[注]:假如同一个起点终点有多条路径即多个权值需要按照实际情况进行取舍保存,假如求的是最短路径,则需要取最小值,但此时由于数组初始值为0,所以需要对数组进行初始化。memset将数组初始化建议为0x3f,memset是cstring中的函数对单字节进行处理,这处理完四字节的int为0x3f3f3f3f此值为10亿多而int型上限为21亿左右,在保证初始化值尽量大的情况下,即使进行×2操作,也不会越界。
读取图并用邻接矩阵去存储:
邻接矩阵适合佛洛依德算法(多源最短路);
②邻接表(邻接矩阵有多余内存):
优点:节省空间;快速知道某点为起点的所有边;
假如有重边,直接全部存入;
使用vector<vector<pair<int, int>>>来实现:
③链式前向星:
优点:方便书写
预先准备:
边结构:{终点,权值, next指针},其中next指针指向相同起点的上一条边;
head数组:head[i]代表以i为起点的上一条边的编号,初始化建议为-1;