- UID
- 3825
- 积分
- 2760
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-4-14
- 最后登录
- 1970-1-1
|
发表于 2005-4-20 21:24:13
|
显示全部楼层
- Dijkstra教授
- Edsger Wybe Dijkstr :1930-2002
- Dijkstra教授,著名的计算机科学和工业先锋,在长时间与癌症的斗争之后,于2002年8月6日,死于Netherlands Nuennen的家中。
- ......1930年生于Netherlands Rotterdam,老爸是个化学家,老妈是个数学家。获得数学和物理双学位,和计算机博士。
- 1952-1962,程序员,Mathematisch Centrum, Amsterdam
- 1962-1984,数学教授,Eindhoven大学
- 1973-1984,研究员,Burroughs Corporation
- 1984-1999,Schlumberger Centennial Chair,某大学
- 1999,退休
- 他有3个孩子,两个孙子。
- 1972年获得图灵奖,..................,1974年 AFIPS Harry Goode Award,
- 1982 IEEE计算机先锋奖,1989 ACM, 因对计算机教育的非凡成就,
- SIGCSE奖;
- 他提出将操作系统作为同步序列方式处理;
- 写了第一个Algol 60编译器;
- 最短路算法;
- 极力倡导在程序中放弃使用GOTO的领导人物;
- 写过很多东西!大约有1300个著作,可以在 [url]http://www.cs.utexas.edu/user/EWD找到它们的电子版。他与许多朋
- 友和同事一直保持联系--不是用电子邮件,而是用传统的书信:[/url])
- 他的智慧、雄辩、以及他说的话都很有名如"计算机是否能思考的
- 问题等同于潜水艇是否能游泳"..................
- 他提出了许多概念丰富了计算机语言,例如"结构化程序设计""同步""向量""栈"
复制代码
- Dijkstra最短路径(一点到各顶点最短路径)
- 阳明
- {本程序解决6个顶点之间的最短路径问题,各顶点间关系的数据文件在sj.txt中}
- {如果顶点I到顶点J不能直达就设置距离为30000}
- program dijkstra;
- type
- jihe=set of 0..5;
- var
- a:array[0..5,0..5] of integer;
- dist:array[0..5] of integer;
- i,j,k,m,n:integer;
- fv:text;
- s:jihe;
- begin
- s:=[0];
- assign(fv,'sj.txt');
- reset(fv);
- for i:=0 to 5 do {从文件中读数据,其中a[i,j]代表从顶点i到顶点j的直达距离,如果不通用30000代替}
- begin
- for j:=0 to 5 do read(fv,a[i,j]);
- readln(fv)
- end;
- for i:=1 to 5 do {设置DIST数组的初始值,即为顶点0到各顶点的直达距离(算法的第一步)}
- dist[i]:=a[0,i];
- for i:=1 to 5 do
- begin
- m:=0;
- dist[m]:=30000; {设置DIST[M]的目的是为下面的一步做准备,即在DIST数组中一个最小的值}
- for j:=1 to 5 do {算法的第二步,找最小的DIST值}
- if (not (j in s)) and (dist[m]>dist[j])
- then m:=j ; {用M来记录到底是哪个顶点}
- s:=s+[m]; {把顶点加入S中}
- for k:=1 to 5 do {算法的第三步,修改后面的DIST值}
- if (not (k in s)) and (dist[k]>dist[m]+a[m,k])
- then
- dist[k]:=dist[m]+a[m,k]
- end;
- writeln('原各顶点间的路径关系是:(30000代表不通)');
- for i:=0 to 5 do
- begin
- for j:=0 to 5 do write(a[i,j]:6);
- writeln
- end;
- writeln; writeln;
复制代码
- Dijkstra 算法:
- 类似标号法,本质为贪心算法。
- var
- a:array[1..maxn,1..maxn] of integer;
- b,pre:array[1..maxn] of integer; {pre[i]指最短路径上I的前驱结点}
- mark:array[1..maxn] of boolean;
- procedure dijkstra(v0:integer);
- begin
- fillchar(mark,sizeof(mark),false);
- for i:=1 to n do begin
- d[i]:=a[v0,i];
- if d[i]< >0 then pre[i]:=v0 else pre[i]:=0;
- end;
- mark[v0]:=true;
- repeat {每循环一次加入一个离1集合最近的结点并调整其他结点的参数}
- min:=maxint; u:=0; {u记录离1集合最近的结点}
- for i:=1 to n do
- if (not mark[i]) and (d[i]< min) then begin
- u:=i; min:=d[i];
- end;
- if u< >0 then begin
- mark[u]:=true;
- for i:=1 to n do
- if (not mark[i]) and (a[u,i]+d[u]< d[i]) then begin
- d[i]:=a[u,i]+d[u];
- pre[i]:=u;
- end;
- end;
- until u=0;
- end;
复制代码 |
|