(u,v)是有向图中的边,我们就称顶点v领接顶点u。
从顶点u到顶点v的路径是顶点序列
<v0,v1,v2...vk>
,其中v0 = v,vk=u。路径中的顶点是唯一的,则称路径是简单的。起点和终点一致则为一个环。如果所有的中间顶点都不相同,则称环是简单的。如果图中的每一对顶点都邻接,则称图为完全图。树林是无圈图,树是连通无圈图。如果图是树,则边为顶点数减去一。
在计算机程序中,有两种表示图的标准方法。一种是矩阵,一种是邻接表(也可以存储有权图,可以定义一个Edge类)。
prime算法(dijkstra算法类似)
n个元素分给p个进程,各自计算本进程内最短值发给P0,P0得到全部最小值后广播给各个进程。给最小值节点纳入最小生成树,更新其他节点的距离。重复操作。
全部顶点间最短路径
使用dijkstra算法
1. 源划分形式:一个进程执行一个单源最短路。进程数目过多性能不好。由并发带来的等效率函数为O(N*N*N)
2. 源并行形式:每个顶点分配p/n个进程,算法总共能用到的进程数目为n*n。
使用Floyd算法
串行算法:三层for循环,每次借助一个中间点来计算两个点间最小值。
并行算法:
二维块映射:每个进程根据Dk-1计算Dk。
流水线二维块映射:每个进程计算完Dk-1后就发送给同行同列相邻进程。其他进程会进行转发。本进程开始第k次迭代。
传递闭包
连通分量
1维块映射到各个进程
稀疏图算法
最大独立集(再加入任何一个节点则违反了)
串行算法:每次拿一个数到独立集中,删除和这个数邻接的所有数,直到为空。
并行算法:luby算法(给每个顶点一个随机值,每次拿随机值最小的节点并删除他和他的邻接节点,重复到为空)
单源最短路径
串行算法的时间复杂度是O(E*logn),E是更新次数,logn是更新时间。
并行算法可以将距离相等的值(安全顶点)一起拿出来更新,或者将不安全节点也更新,可以回退。
分布式内存形式:每个进程管几个节点,各自维护一个优先队列。包含源节点的先更新再传给其他节点。如果其他节点有了一个通往源点的路径(一般是该节点可以到达传来的节点)则将其加入优先队列。优先队列会每次得出一个最小值。如果传来的节点使得原来的路径变小了,则原来的节点要重新加入优先队列。
二维块映射:
二维循环映射:少了空闲的时间,但是多了通信的时间。
一维块映射: