最短路径算法之二:Dijkstra总结

Dijkstra算法(已更改)

参考Dijkstra算法图解

  • 时间复杂度:O(n^2)
  • 实现查找单源点最短路径问题
  • 贪心算法
    步骤
    1、和Floyd算法一样,首先对图map进行初始化(各源点间的距离无限大),其次输入源点关系。
    2、 两个集合(vis[] 和dis[] ),vis集合是存放已经是最短路径的源点,dis集合是到各源点的最短路径
    3、对开始结点的 dis [ begin ] 赋值为0,然后通过遍历查找dis中最短的结点,因为dis初始化为 inf ,所以在第一次遍历过程中开始结点肯定是第一个被加入到 vis 中。之后再通过以开始结点为前驱结点当做跳点更新dis数组。为何不一开始就将开始结点加入 vis 是为了在进行Dijkstra算法和dfs算法结合问题是不用在做出修改(具体的请了解Dijkstra+dfs总结)

核心部分


//参数 k 为开始源点 
void dijkstra(int k)
{
	dis[S] = 0;			//关键 
	//循环遍历 
	for(int i = 0; i < N; i++)
	{
		int temp = -1;		//标记找到的最小值 
		int aaa = inf;	//进行迭代松弛 
		for(int j = 0; j < N; j++)
		{
			if( !vis[j] && dis[j]< aaa)
			{
				aaa = dis[j];
				temp = j;
			}
		 } 
		if(temp == -1) return;
		vis[temp] = 1;
		//根据找到的最短路径更新 dis
		for(int j = 0; j < N; j++)
		{
			if(!vis[j])//找到没有确定最短路径的结点 
			{
				//判断是否是最短路径 
				if(dis[j] > dis[temp] + map[temp][j])
				{
					//更新dis 
					dis[j] = dis[temp] + map[temp][j];
				}
			}
		 } 	
	 } 
}

代码

//Dijkstra算法模板 
#include 
#include 
#include  
#define inf 0x3f3f3f	//代表无限大 
using namespace std;
int N,M;
int k;					//查找的源点 
int map[100][100];		//图
int dis[100];			//存放从 i 到其他点的最短距离
int vis[100];			//存放已经是最短距离的点 


void dijkstra(int k)
{
	dis[S] = 0;			//关键 
	//循环遍历 
	for(int i = 0; i < N; i++)
	{
		int temp = -1;		//标记找到的最小值 
		int aaa = inf;	//进行迭代松弛 
		for(int j = 0; j < N; j++)
		{
			if( !vis[j] && dis[j]< aaa)
			{
				aaa = dis[j];
				temp = j;
			}
		 } 
		if(temp == -1) return;
		vis[temp] = 1;
		//根据找到的最短路径更新 dis
		for(int j = 0; j < N; j++)
		{
			if(!vis[j])//找到没有确定最短路径的结点 
			{
				//判断是否是最短路径 
				if(dis[j] > dis[temp] + map[temp][j])
				{
					//更新dis 
					dis[j] = dis[temp] + map[temp][j];
				}
			}
		 } 	
	 } 
}


int main(int argc, char** argv) {
	cin >> N >> M;
	//初始化图 
	for(int i = 1; i <= N; i++)
		for(int j = 1; j <= N; j++)
			if(i == j) map[i][j] = 0;
			else map[i][j] = map[j][i] = inf;
	//初始化结果数组 
	memset(vis,0,sizeof(vis));
	
	int a,b,c;
	for(int i = 1; i <= M; i++)
	{
		cin >>a>>b>>c;
		map[a][b] = map[b][a] = c;
	}

	cin >> k;
	dijkstra(k); 
	 
	 //输出 
	 for(int i = 1; i <= N; i++)
	 {
	 	cout << i << ":  " << dis[i] << endl;
	  } 
	return 0;
}

你可能感兴趣的:(算法模板,最短路径)