Dijkstra最短路径

原创 2013年12月04日 12:46:52

题目描述

在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。
在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。
可将迪杰斯特拉算法描述如下:
在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出源点至每一个其它顶点的最短路径长度。

输入格式

输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。
以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。

输出

只有一行,共有n-1个整数,表示源点至其它每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。
请注意行尾输出换行。

样例输入

4 1
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

样例输出

6 4 7 

提示[-]

在本题中,需要按照题目描述中的算法完成迪杰斯特拉算法,并在计算最短路径的过程中将每个顶点是否可达记录下来,直到求出每个可达顶点的最短路径之后,算法才能够结束。
迪杰斯特拉算法的特点是按照路径长度递增的顺序,依次添加下一条长度最短的边,从而不断构造出相应顶点的最短路径。
另外需要注意的是,在本题中为了更方便的表示顶点间的不可达状态,可以使用一个十分大的值作为标记。


算法关键点:

    1.若两顶点不可达,则将其设置为无穷大;若可达,则为权值。

    2,源点的权值设为0。

   3,将所有顶点分为两组,一组已经确定最短路径,即与源点为一个集合,另一组未确定路径,即剩下的全部顶点。

   4,用Dist数组分别表示从源点到该顶点的最短路径长度。

   5,进行N-1次循环,每次将一个顶点划分为和源点一组。

   6,每次重新划分组后,将Dist数组逐个更新。


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int const MAXLEN = 100;
const int INF = 1000000000;
int M[MAXLEN][MAXLEN];
int Dist[MAXLEN];
bool Visit[MAXLEN]={false};//标记是否确定路径
int N;//顶点数
int Start;//源点

void GetM()
{
    cin>>N>>Start;
	int temp;
	for(int i=0;i<N;i++)
	{
	    for(int j=0;j<N;j++)
		{
		    cin>>temp;
			if(temp==0) M[i][j]=INF;
			else M[i][j]=temp;
		}
	}
}

void Init()
{
	for(int i=0;i<N;i++)Dist[i]=M[Start][i];
	Visit[Start]=true;
	Dist[Start]=0;

}

void Dijkstra()
{
	Init();
    for(int i=0;i<N-1;i++)
	{
	        int v;
		int newdist=INF;
		for(int j=0;j<N;j++)
		{
			if(!Visit[j] && Dist[j]<newdist)
			{
			        v=j;
				newdist=Dist[j];
			}
		}

		Visit[v]=true;

		for(int j=0;j<N;j++)
		{
			if(!Visit[j] && (Dist[v]+M[v][j])<Dist[j])
			{
				Dist[j]=Dist[v]+M[v][j];
			}
		}
	}
	
}

void Print()
{
	for(int i=0;i<N;i++)
	{
	    if(i!=Start)
		{
			if(Dist[i]>=INF)   cout<<"-1 ";
			else cout<<Dist[i]<<" ";
		}
	}
	cout<<endl;
}
 
int main()
{
	freopen("D:\\test.txt","r",stdin);
	freopen("D:\\tested.txt","w",stdout);
	GetM();
	Dijkstra();
	Print();
	return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

Dijkstra最短路径模板2

Dijkstra最短路径模板1见http://blog.csdn.net/abcjennifer/article/details/7243297 畅通工程续 Time Limit: 3000/1...
  • abcjennifer
  • abcjennifer
  • 2012年02月23日 14:01
  • 5010

获取多条最短路径的Dijkstra算法

学习Dijkstra算法,并扩展成可以获取所有最短路径
  • u013615687
  • u013615687
  • 2017年04月04日 14:43
  • 1157

最短路径 输出路径 Dijkstra算法

某个源点到其余各顶点的最短路径 这个算法最开始心里怕怕的,不知道为什么,花了好长时间弄懂了,也写了一遍,又遇到时还是出错了,今天再次写它,心里没那么怕了,耐心研究,懂了之后会好开心的,哈哈Dijkst...
  • qq_36183935
  • qq_36183935
  • 2017年04月03日 20:38
  • 1959

经典算法之图的最短路径(一):Dijkstra算法

Dijkstra算法可以说基本上每一本有讲到图的最短路径的书上都会有的一个算法,但基本上都是讲原理和伪代码,今天自己用Java代码给实现了一下,记录在此。 Dijkstra算法只是解决某些图的最短路径...
  • silent_strings
  • silent_strings
  • 2015年09月01日 15:50
  • 2817

经典算法——迪杰斯特拉(Dijkstra)最短路径

基本思想迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点...
  • hezhangping
  • hezhangping
  • 2016年08月27日 15:30
  • 2356

利用Dijkstra算法实现记录每个结点的所有最短路径

我们知道,Dijkstra是解决单源最短路问题的,并且最基本的算法仅能求出最短路的长度,而不能输出路径,本文基于Dinjkstra进行改进,使之能记录源点到任意点的所有最短路径。使用vector来记录...
  • xyt8023y
  • xyt8023y
  • 2015年05月29日 13:16
  • 3113

数据结构与算法——最短路径Dijkstra算法的C++实现

数据结构与算法——最短路径Dijkstra算法的C++实现
  • Linux_ever
  • Linux_ever
  • 2016年05月04日 13:26
  • 6254

最短路径算法复杂度总结

Dijkstra:O(n2)适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV), BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度O(VE...
  • basycia
  • basycia
  • 2016年02月29日 16:36
  • 5495

通俗算法讲解之图最短路径——Dijkstra算法

Dijkstra算法计算单源有向正权值图最短路径计算
  • qq_26849233
  • qq_26849233
  • 2016年10月27日 19:05
  • 813

(ACM)Dijkstra最短路径算法

1  最短路径算法  在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题, ...
  • u012860063
  • u012860063
  • 2014年02月22日 09:19
  • 2590
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dijkstra最短路径
举报原因:
原因补充:

(最多只允许输入30个字)