小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
引
今天刚上完算法的课程,对这个算法有了进一步的了解。虽然说以前在数据结构里就已经明白了这个算法的主要思想,但今天的算法课程让我对其中一些步骤的实现有了更加清晰直观的了解。
另外提出一点,我们算法老师对于一个算法研究的步骤是这样规范的:第一步理清算法的过程与实现的流程,第二步编写代码,第三步对代码进行优化与查错。我这一篇主要写第一步,后续的课程讲完后,我会陆续补充。
算法的流程与重点
首先给出教材上的例子。
我们使用二维数组来存储点与边之间的关系
| s | t | x | y | z | |
|---|---|---|---|---|---|
| s | 6 | 4 | |||
| t | 3 | 2 | |||
| x | 4 | ||||
| y | 1 | 9 | 3 | ||
| z | 7 | 5 |
算法思路
我们假设s为源点,s有两条向外发射的路径,分别为:s->y,s->t,长度分别为:4,6。
我们选择最短的一条,即y点被确定,y取值为4表示从s到y最短路径长度为4。
这个时候,我们的图中有两个确定的点:s、y,一条确定的路径s->y。
再找s、y两点向外发射的路径,有s->t、y->t、y->z、y->x这三条,长度分别为:6,5,7,13.
我们选择最短的一条,即y->t,t点被确定,取值为5,表示从s经由y到t点的最短路径长度为5。
循环此步骤,即可确定图中s到所有点最短路径。实际上,教材里的图示也能够很好理解这个算法。
伪代码
当我们理清了算法的思路后,就不难写出伪代码了。
void Dij(int g[5][5],int s,int d[5]){
数组d赋值无穷大;
d[s]=0;
int a=s;
int i=1;
while(i<=5){
findmin and update(d[*])
a=min(d[*]);
}
print d[*]
}
后续我明天或者下午再补一下,好饿我要去吃饭........
算法方面感觉很容易出错或者其他差漏,如果有问题请及时提醒我。