单源最短路径的Dijkstra算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单源最短路径的Dijkstra算法:

问题描述:

给定一个带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。

算法描述:

Dijkstra算法是解单源最短路径的一个贪心算法。基本思想是:设置顶点集合S并不断地做贪心选择来扩充这个集合。一个顶点属于S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist做必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。

源代码:

#include

#define MAX 1000

#define LEN 100

int k=0, b[LEN];

using namespace std;

//-------------------------------------数据声明------------------------------------------------//c[i][j]表示边(i,j)的权

//dist[i]表示当前从源到顶点i的最短特殊路径长度

//prev[i]记录从源到顶点i的最短路径上的i的前一个顶点

//---------------------------------------------------------------------------------------------

void Dijkstra(int n, int v, int dist[], int prev[], int c[][LEN])

{

bool s[LEN]; // 判断是否已存入该点到S集合中

for (int i = 1; i <= n; i++)

{

dist[i] = c[v][i];

s[i] = false; //初始都未用过该点

if (dist[i] == MAX)

prev[i] = 0; //表示v到i前一顶点不存在

else

prev[i] = v;

}

dist[v] = 0;

s[v] = true;

for (int i = 1; i < n; i++)

{

int temp = MAX;

int u = v;

for (int j = 1; j <= n; j++)

if ((!s[j]) && (dist[j] < temp)) //j不在s中,v到j距离不在为无穷大

{

u = j; // u保存当前邻接点中距离最小的点的号码

temp = dist[j];

}

s[u] = true;

k++;

b[k] = u;

cout<<"----------------------------------------------------------"<

cout<<"迭代次数:"<

cout<<"顶点为:";

cout<

for (int i = 1; i <= k; i++)

cout<

cout<

for (int j = 1; j <= n; j++)

if ((!s[j]) && c[u][j] < MAX)

{

int newdist = dist[u] + c[u][j];

if (newdist < dist[j])

{

dist[j] = newdist; //更新dist

prev[j] = u; //记录前驱顶点

}

}

cout<<"单源路径分别为:"<

for (int i = 2; i <= n; i++)

if (dist[i] != MAX)

cout<

cout<

}

cout<<"----------------------------------------------------------"<

// t[i] = prev[i];

int p[LEN];

for (int i = 2; i <= n; i++)

{

cout<<"dist["<

cout<<"路径为:"<

/*while (t[i] != v)

{

cout << t[i] << "\t";

t[i] = prev[t[i]];

}*/

int m = prev[i];

int k=0;

while (m != v)

{

k++;

p[k] = m;

m = prev[m];

}

for (int x = k; x >= 1; x--)

cout<

cout<

cout<

}

}

相关文档
最新文档