最短路径问题(dijkstra)
Description
平面上有n個點(N<=100),每個點的坐標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從一個點到達另一個點,即兩點間有通路,通路的距離為兩點直線的距離。現(xiàn)在的任務是找出從一點到另一點之間的最短路徑。
Input
輸入文件short.in,共有n+m+3行,其中:?
第一行為一個整數(shù)n。?
第2行到第n+1行(共n行),每行的兩個整數(shù)x和y,描述一個點的坐標(以一個空格隔開)。?
第n+2行為一個整數(shù)m,表示圖中的連線個數(shù)。?
此后的m行,每行描述一條連線,由兩個整數(shù)I,j組成,表示第i個點和第j個點之間有連線。?
最后一行:兩個整數(shù)s和t,分別表示源點和目標點。?
Output
輸出文件short.out僅一行,一個實數(shù)(保留兩位小數(shù)),表示從S到T的最短路徑的長度。
Sample Input
5 0 0 2 0 2 2 0 2 3 1 5 1 2 1 3 1 4 2 5 3 5 1 5Sample Output
3.41
分析
先算出點與點之間的距離
距離=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]))
從s開始算最短路徑,最后輸出d[t]就行了var
n,i,m,s,t,x1,y1:longint;
a:array[0..200,0..200]of real;
x,y:array[0..200]of longint;
mark:array[0..200]of boolean;
d:array[0..200]of real;
pre:array[0..200]of longint;
procedure dij;
var
i,j,u:longint;
min:real;
begin
? ? fillchar(mark,sizeof(mark),false);
? ? mark[s]:=true;
? ? for i:=1 to n do
? ? begin
? ? ? ? d[i]:=a[s,i];
? ? ? ? if a[s,i]<>127 then pre[i]:=s else pre[i]:=0;
? ? end;
? ? repeat
? ? ? ? ?u:=0;min:=maxlongint;
? ? ? ? ?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(d[u]+a[u,i]<d[i]) then
? ? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ?d[i]:=d[u]+a[u,i];
? ? ? ? ? ? ? ? ?pre[i]:=u;
? ? ? ? ? ? ?end;
? ? ? ? ?end;
? ? until u=0;
end;
begin
? ? readln(n);
? ? for i:=1 to n do
? ? readln(x[i],y[i]);
? ? readln(m);
? ? fillchar(a,sizeof(a),127);
? ? for i:=1 to m do
? ? begin
? ? ? ? readln(x1,y1);
? ? ? ? a[x1,y1]:=sqrt(sqr(x[x1]-x[y1])+sqr(y[x1]-y[y1]));
? ? ? ? a[y1,x1]:=a[x1,y1];
? ? end;
? ? read(s,t);
? ? dij;
? ? write(d[t]:0:2);
end.
轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9500143.html
總結(jié)
以上是生活随笔為你收集整理的最短路径问题(dijkstra)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 城市问题(Floyd)
- 下一篇: 城市问题(dij)