最短路问题_Dijkstra算法

模板如下:
现在我将在代码注释中解释此算法!让我们先从主函数看起

#include<iostream>
#include<queue>
using namespace std;
#define MAXN 2550
#define INF 0x3f3f3f
int n,m,s,d;
int dist[MAXN];//i到j的最短距离 
int graph[MAXN][MAXN];
bool vis[MAXN] = {false};
int pre[MAXN];
void DJ(int start)
{
	//初始化
	for(int i = 1; i <= n; i++) 
	{
			dist[i] = graph[start][i];//这个数组的意思是源点到其他点的距离,这里我们根据与源点邻接来初始化这个数组
			pre[i] = start;//我们把他们的前驱结点初始化为源点
	}
	vis[start] = true;
	for(int i = 2; i <= n; i++)//除了源点,还有n-1个点,故找n-1次
	{
		int MIN = INF,MINID;寻找当前从原点到其余各点距离的最小值,并记录下这个值的点的位置
		for(int i = 1; i <= n; i++)//遍历dist数组,找最小值
		{
			if(!vis[i]&&dist[i]<MIN)
			{
				MINID = i;
				MIN = dist[i];
			}
		}
		vis[MINID] = true;//找到后,标记,这个点就相当于选好了
		for(int i = 1; i <= n; i++)//以这个点去开拓新大陆,开始更新路径,如果原路径的长度大于开拓之后的路径,那么我们就更新路径,并把更新掉的路径的前驱结点更新为MINID
		{
			if(!vis[i] && dist[MINID] + graph[MINID][i] < dist[i])
			{
				dist[i] = dist[MINID] + graph[MINID][i];
				pre[i]  = MINID;
			}
		}
	} 
	
} 
int main()
{
	cin>>n>>m>>s>>d;
	//初始化graph
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			if(i == j) graph[i][j] = 0;//自己到自己必然是0
			else graph[i][j] = INF;//到不了的点是无穷大这也没问题吧
		}
	} 
	for(int j = 1; j <= m; j++)
		{
			int x,y,distance;
			cin>>x>>y>>distance;
			graph[x][y] = distance;//这个地方,你得看明白无向图还是有向图
			graph[y][x] = distance;
		}
	DJ(s);//咱们转移到Dijkstra函数
	cout<<dist[d]<<endl;
	return 0;
}
发布了35 篇原创文章 · 获赞 0 · 访问量 945

猜你喜欢

转载自blog.csdn.net/ACM_Cmy/article/details/103152119