有向图求解最短路径算法
Dijkstra算法:
主要用来求具体的某一点到其他个点的最短路径
首先,放置两个空集合
一个集合1放已求出最短路径的点,另一个集合2放未求最短路径的点
举例,
在一个图中,有A,B,C,D,E五个结点
求A到各点的最短距离
首先将A点(源点)放入集合1中,
因为我们已知A点到自己的最短距离是0,是A点到所有点 距离的最小值
下一步,看A点到B,C,D,E四点的距离
AB=10,
AC=+∞(未直接相连),
AD=30,
AE=100
可以看出,AB值最小,距离最短,所以将B加入集合1中
将B加入集合1后,看剩余A到C,D,E的最短路径值是否发生变化
此时到C,D,E三点的最短距离分别是:
ABC=60,
AD=30,
AE=100
AD距离最短,将D加入集合1
重复,看加入D后A到C,E的路径值
ABC=60 -> ADC=50
AE=100 -> ADE=90
将C加入集合1
ADE=90 -> ABCE=70
可以看到结果,A到各点最短距离:
AB=10,
AD=30,
AC=50,
AE=70
Floyd算法:
主要用于求解所有点之间最短路径的问题
用一个矩阵或者二维表来求解
对角线值均为0
两点间有边则填边的权值
无边则用∞表示
开始只有直接相连的路径值
然后,逐渐加入中转点,
加入一个中转点就查看一次各点之间最短路径是否改变
修改矩阵中的值
如,先看如果可以经过v0中转,是否可以缩短路径
然后看经过v0,v1中转是否可以缩短路径,然后依次查看
最后得到所有点之间的最短路径
判断是否有环
有向图:
对有向图进行拓扑排序,看是否所有结点都进入了序列
无向图:
1.对于无向图的每个连通分量,如果边数E大于等于顶点数V,则该连通分量中一定存在环
2.某个顶点开始进行深度优先遍历,在遍历过程中,如果遇到某个顶点的一条边指向已经访问过的顶点(且这个顶点不是当前顶点的父顶点),则说明存在环