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相同数量级的数即可