图论-最短路Dijkstra算法

  • 单源最短路(固定一个顶点为原点,求原点到其他每个顶点的最短路径)
    • 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;
}
发布了22 篇原创文章 · 获赞 6 · 访问量 1719

猜你喜欢

转载自blog.csdn.net/qq_44759750/article/details/102730410
今日推荐