没有箭头的那一段是弧尾,有箭头的那一段叫弧头。AE中A是弧尾,E是弧头。
强连通就是正反都有路径,A和B是强联通的,A和E就不是强连通的
极大连通子图是子图,且连通,且包含尽可能多的顶点和边
有向图中的 极大强连通子图 称为有向图的 强连通分量(极大强连通子图是强连通分量)
北京到上海的带权路径长度是200+600=800
n个顶点的连通图最少有n-1条边,如果在多一条边,一定有回路。
0表示不连接,1表示连接。
Vex数组中存储A,B,C,D,E,F,
然后在Edge中对应数组下标0,1,2,3,4,5,
这样我们表示AB这条边 就可以用Edge[0][1]=1来表示了。
因为Edge数组中只存0、1,且bool类型只占1个字节,比int类型占4个字节 占用的空间少,所以可以考虑使用bool类型表示边。
下图中的(vi,vj)中的v是上图中的char型名为Vex的数组。
无向图中:边会被链表使用两次,所以边结点的数量是2|E|,整体空间复杂度是O(|V|+2|E|).
无向图中度就是遍历对应结点的链表就行了。
有向图中:求出度容易,直接遍历对应结点的链表就行了,找 出边也容易,如果求入度、度、入边,那么需要遍历整个表才行。
十字链表法解决了有向图 找入边 不方便问题。
橙色连接了弧头相同的弧,绿色连接了弧尾相同的弧。
下图O(|E|)是 要遍历每一条边 来删除与 被删除结点 有关的边,如图中就是遍历每条边来删除与结点C有关的边。
获取或设置权值 即 找到对应的边,然后获取或设置权值(获取和设置权值的时间复杂度是O(1) )。所以获取或设置权值的整体操作(包括找边和设置权值)和 只找边的时间复杂度相同。
最坏情况,要一次把所有邻接点(即其余结点装入辅助队列),此时空间复杂度最高。
算法时间开销主要是:访问各个顶点和查找每个顶点的邻接点。
标红,当某个顶点第一次被访问时是从哪条边过去的
把广度优先生成树放在一起,就是广度优先生成森林。
标红,当某个顶点第一次被访问时是从哪条边过去的,把标红的边 和 结点单独拿出来,未标红的边去掉,就形成了深度优先生成树。
下图,如果7仅仅能和邻接顶点6、3、8有路径而和其余顶点5、1、2、4没有路径,那么调用次数也是要多于1次的。
带权、连通、无向
直到所有结点都连通,算法结束。
BFS算法求单源最短路径只适用于无权图,或所有边的权值都相同的图。
按照最短路径的求解方法生成的树,高度一定是最小的。
每轮处理一个结点,( 花费时间O(n) )
每处理一个结点要遍历一遍dist数组查找最小的。( 花费时间O(n) )
时间复杂度 O(n²)
首先选择还没确定最短路径的,且dist中最小的值 的 对应顶点设为true。
然后把V1设为true,算法结束。
通过算法得出的V1到V2的最短路径是7,而实际最短路径是5,说明Dijkstra算法不适用于有负权值的带权图。
允许V0中转后,仅会更新以下一处数据。
允许V0、V1中转后,仅会更新以下一处数据。
允许V0、V1、V2中转后,仅会更新以下一处数据。
比如从V0走到V1是-9,
如果V0->V1->V2->V0->V1是-9+(3+4±9)=-9±2=-11
这样每走一圈,V0到V1的最短路径就更小一次,没有尽头,无穷无尽。
事件是一瞬间完成的。
每个活动的最早发生时间,就是这个活动的弧尾所连的这个事件的最早发生时间