1 本质 已知到点与点之间的相对路程 求特定节点与特定节点的绝对路程dist 比较a到b和a到c再到b的路程 2 存储 节点编号一般是1~n 有向/无向图/重边/自环 无向*2 稀疏图——邻接表 空间 m+n memset(h,0,sizeof h); 加入有向边(x,y) 权值为z void add(int x,int y,int z) { idx++; e[idx]=y; w[idx]=z; ne[idx]=h[x]; h[x]=idx; } 访问从x出发的所有边 for(int i=h[x],i,i=ne[i]) { int y=e[i]; int z=w[i]; } 稠密图——邻接矩阵 空间 n^2 反向存图可实现多对一 = 0 ( a == b ) g[a][b] = min( g[a][b] , c ) = INF 3 类型 多源 Floyd O( n^3 ) 单源 边权为1 BFS 边权为0或1 deque + BFS 边权为正 朴素dijstra 稠密图 O( n^2 ) 优化dijstra 稀疏图 O( mlogn ) 存在负权 SPFA O( nm ) 经过不超过k条边 bellman-ford O( nm ) 4 负权边 若有负权边是否能到达n号点的判断中需要 进行if(dist[n] > INF/2)判断,而并非是if(dist[n] == INF) 原因是INF是一个确定的值,并非真正的无穷大, 会随着其他数值而受到影响,dist[n]大于某个与INF相同数量级的数即可