您的位置:首页 > 其它

最短路径算法

2011-08-12 10:19 176 查看
球最短路径的经典算法是----迪杰斯特拉算法。

迪杰斯特拉算法的实现过程和普里姆求最小生成树的算法很相似。主要是先理解算法的实现过程在利用模板处理各个题目的不同要求,达到以不变应万变的效果。

下面给出算法的理论实现:

其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。

初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。

例如,对下图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下表中。



Dijkstra算法的迭代过程:



主题好好理解上图!

下面给出例题来写出该算法的模板:

杭电ACM2544

点击打开链接

#include <iostream>
using namespace std;
int map[105][105], vis[105], dist[105], m, n;
#define MAX 88888888

void Djstl(int v)
{
int i,j, tmp_min, newdist;
vis[v] = 1;
for(i=1; i<=n; i++)
dist[i] = map[v][i];
dist[v] = 0;
for(i=2; i<=n; i++)
{
tmp_min = MAX;
for(j=1; j<=n; j++)
if(tmp_min>dist[j] && vis[j] == 0)
{
v = j;
tmp_min = dist[j];
}
vis[v] = 1;
for(j=1; j<=n; j++)
if(vis[j]==0 && map[v][j]<MAX)
{
newdist = dist[v] + map[v][j];
if(dist[j]>newdist)
dist[j] = newdist;
}
}
}

void init()
{
memset(dist,0,sizeof(dist));
memset(vis,0,sizeof(vis));
int i, j, a, b, c;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
map[i][j] = MAX;
for(i=1; i<=m; i++)
{
cin>>a>>b>>c;
if(c<map[a][b])
map[a][b] = map[b][a] = c;
}
}

void main()
{
while(cin>>n>>m && (m+n))
{
init();
Djstl(1);
cout<<dist
<<endl;
}
}

更具体的实现请看链接:

http://www.wutianqi.com/?p=1890
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: