- 单源最短路(固定一个顶点为原点,求原点到其他每个顶点的最短路径)
- 1、边权非负:Dijkstra算法。
- 2、边权允许为负:Bellman-Ford算法。
- 3、Bellman-Ford算法的改进版本:SPFA算法。
- 多源最短路径(计算每个点之间的最短路)
- 4、求所有顶点之间的最短路径:Floy算法
Dijkstra:
首先该算法-是单源最短路(固定一个顶点为原点,求原点到其他每个顶点的最短路径)。
然后两点之间的最短路径只有两种情况,(1)直接说两点之间最短;(2)经过其他点的路径最短。
就是
解决方法来了
dist[maxs]、S[maxs]、endge[maxs][maxs];
我们需要用一个数组dist[maxs] 来保存原点到各点的距离,初始化是应该是原点直接到达各个点的距离(无法到达的就是inf),之后如果找到了最短路径就将dist改变,再用一个数组**S[maxs]**来保存图中所有的点(按顺序排的,比如:1 2 3 4…)用来标记图中哪些点已经走过了(初始化全部为0,走过了就标记为1)。最后就是邻接矩阵 endge[maxs] [maxs],用来保存图中点与点的关系。
(可以根据自己的需要增加一个数组,用来保存具体的最短路径);
例题:POJ2387
Dijkstra算法:
#include<iostream>
using namespace std;
#define max 1001
#define inf 1<<29//无穷大
int T, N, endge[max][max];
void dijkstra(int u)
{
int dist[max];
bool S[max];
int V;
for (int i = 1; i <= N; i++)
{
S[i] = 0;//标记数组
dist[i] = endge[u][i];//源点N到各点的距离
}
//S[u] = 1;
//核心循环代码
for (int i = 1; i <= N; i++)
{
int min = inf;
for (int j = 1; j <= N; j++)
{
if (!S[j] && dist[j] < min)
{
min = dist[j];
V = j;
}
}
S[V] = 1;
for (int j = 1; j <= N; j++)
{
if (!S[j] && dist[j] > dist[V] + endge[V][j])
{
dist[j] = dist[V] + endge[V][j];
//V = j;
//cout << dist[V] << endl;
//S[j] = 1;
}
}
}
cout<<dist[N]<<endl;
}
int main()
{
int a, b,c;
cin>>T>>N;
//初始化边权数组
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
if (i != j)
endge[i][j] = inf;
else
endge[i][j] = 0;
}
}
for (int i = 1; i <= T; i++)
{
cin >> a >> b >> c;
endge[a][b] = endge[a][b] > c ? c : endge[a][b];
endge[b][a] = endge[b][a] > c ? c : endge[b][a];
}
dijkstra(1);
return 0;
}