发布网友 发布时间:2022-04-28 21:24
共2个回答
热心网友 时间:2022-04-08 05:25
下面是该算法的Pascal程序 typebool=array[1..10]ofboolean;arr=array[0..10]ofinteger;vara:array[1..10,1..10]ofinteger;//存储图的邻接数组,无边为10000c,d,e:arr;//c为最短路径数值,d为各点前趋,t:bool;//e:路径,t为辅助数组i,j,n,m:integer;inf,outf:text;procereinit;//不同题目邻接数组建立方式不一样beginassign(inf,inputfile);assign(outf,outputfile);reset(inf);rewrite(outf);read(inf,n);fori:=1tondobeginforj:=1tondobeginread(inf,a[i,j]);ifa[i,j]=0thena[i,j]:=10000;end;end;end;proceredijkstra(qi:integer;t:bool;varc{,d}:arr);//qi起点,{}中为求路径部分,不需求路径时可以不要vari,j,k,min:integer;begint[qi]:=true;//t数组一般在调用前初始,除起点外所有节点都化成false,也可将部分点初始化成true以回避这些点fori:=1tondod[i]:=qi;d[qi]:=0;fori:=1tondoc[i]:=a[qi,i];fori:=1ton-1dobeginmin:=maxint;//改为最大值forj:=1tondoif(c[j]<min)andnott[j]thenbegink:=j;min:=c[j];end;t[k]:=true;forj:=1tondoif(c[k]+a[k,j]<c[j])andnott[j]thenbeginc[j]:=c[k]+a[k,j];d[j]:=k;end;end;end;proceremake(zh:integer;d:arr;vare:arr);//生成路径,e[0]保存路径vari,j,k:integer;//上的节点个数begini:=0;whiled[zh]<>0dobegininc(i);e[i]:=zh;zh:=d[zh];end;inc(i);e[i]:=qi;e[0]:=i;end;主程序调用:求长度:初始化t,然后dijkstra(qi,t,c,d)
求路径:make(m,d,e) ,m是终点 1. 将与源点相连的点加入堆,并调整堆。
2. 选出堆顶元素u(即代价最小的元素),从堆中删除,并对堆进行调整。
3. 处理与u相邻的,未被访问过的,满足三角不等式的顶点
1):若该点在堆里,更新距离,并调整该元素在堆中的位置。
2):若该点不在堆里,加入堆,更新堆。
4. 若取到的u为终点,结束算法;否则重复步骤2、3。 procereDijkstra;varu,v,e,i:longint;beginfillchar(dis,sizeof(dis),$7e);//距离fillchar(Inh,sizeof(Inh),false);//是否在堆中fillchar(visit,sizeof(visit),false);//是否访问过size:=0;e:=last[s];whilee<>0do//步骤1beginu:=other[e];ifnot(Inh[u])then//不在堆里begininc(size);heap[size]:=u;dis[u]:=cost[e];Loc[u]:=size;//Loc数组记录元素在堆中的位置Inh[u]:=true;Shift_up(Loc[u]);//上浮endelseifcost[e]<dis[u]then//在堆里begindis[u]:=cost[e];Shift_up(Loc[u]);Shift_down(Loc[u]);end;e:=pre[e];end;visit[s]:=true;whiletruedobeginu:=heap[1];//步骤2ifu=tthenbreak;//步骤4visit[u]:=true;heap[1]:=heap[size];dec(size);Shift_down(1);e:=last[u];whilee<>0do//步骤3beginv:=other[e];ifNot(visit[v])and(dis[u]+cost[e]<dis[v])then//与u相邻的,未被访问过的,满足三角不等式的顶点ifInh[v]then//在堆中begindis[v]:=dis[u]+cost[e];Shift_up(Loc[v]);Shift_Down(Loc[v]);endelse//不再堆中begininc(size);heap[size]:=v;dis[v]:=dis[u]+cost[e];Loc[v]:=size;Inh[v]:=true;Shift_up(Loc[v]);end;e:=pre[e];end;end;writeln(dis[t]);end;
热心网友 时间:2022-04-08 06:43
· 算法思想