最短路徑問題 題解

2021-10-01 18:39:58 字數 3572 閱讀 3520

平面上有n

nn個點 (

n<

=100

)(n <= 100 )

(n<=1

00),每個點的座標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。

共有n +m

+3

n+m+3

n+m+

3行,其中:

第一行為乙個整數nnn。

第2行到第n+1

n+1n+

1行(共n

nn行),每行的兩個整數x

xx和y

yy,描述乙個點的座標(以乙個空格隔開)。

第n +2

n+2n+

2行為乙個整數m

mm,表示圖中的連線個數。

此後的m

mm行,每行描述一條連線,由兩個整數i,j

i,ji,

j組成,表示第i

ii個點和第j

jj個點之間有連線。

最後一行:兩個整數s

ss和t

tt,分別表示源點和目標點。

乙個實數(保留兩位小數),表示從 s

ss 到 t

tt 的最短路徑的長度。

input

50 0

2 02 2

0 23 1

51 2

1 31 4

2 53 5

1 5output

3.41

第一種:floyed演算法

初始:dis

disdi

s陣列付最大值

如果點u

uu和點v

vv相連,dis

[u][

v]

=dis[u][v]=

dis[u]

[v]=

兩點相連的距離

迴圈:第一層:列舉斷點

第二層:列舉起點

第三層:列舉終點

起點,斷點和終點不一樣,並且 dis

[i][

j]

>di

s[i]

[k]+

dis[

k][j

]dis[i][j]>dis[i][k]+dis[k][j]

dis[i]

[j]>di

s[i]

[k]+

dis[

k][j]di

s[i]

[j]=

dis[

i][k

]+di

s[k]

[j

]dis[i][j]=dis[i][k]+dis[k][j]

dis[i]

[j]=

dis[

i][k

]+di

s[k]

[j]( 適用於處理負邊權 )

第二種:dijkstra演算法

初始:dis

disdi

s陣列付最大值

如果點u

uu和點v

vv相連,dis

[u][

v]

=dis[u][v]=

dis[u]

[v]=

兩點相連的距離

找乙個未走過的最短路徑的點v

vv更新與它相連的所有點的距離

第三種:ford演算法

初始:dis

disdi

s陣列付最大值

起點d is

[s

]dis[s]

dis[s]

=0用所有白點更新與之相連的點的最短路徑

直到不進行鬆弛操作

第一種:floyed演算法

#include

#include

#include

#include

using namespace std;

int n,m,x,y;

double d[120]

[120]

;struct ca[120]

;int main(

) cin>>x>>y;

for(int k=1;k<=n;k++)

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

if(i!=k&&j!=k&&i!=j&&d[i]

[j]>d[i]

[k]+d[k]

[j])

d[i]

[j]=d[i]

[k]+d[k]

[j];

cout<<[y]

}

第二種:dijkstra演算法

#include

#include

#include

#include

using namespace std;

const double maxn=0x7fffffff;

double d[10020]

[10020],dis[120]

;int p[120],n,m,x2,y2,x[120],y[120]

;int main(

)

cin>>x2>>y2;

dis[x2]

=0;for

(int i=1;i<=n;i++)

if(!k)break

; p[k]

=1;for

(int j=1;j<=n;j++)

if(p[j]

==0&&d[j]

[k]!=0)

dis[j]

=min(dis[j],dis[k]+d[j]

[k]);}

printf(

"%.2lf",dis[y2]);

return 0;

}

第三種:ford演算法

#include

#include

#include

#include

using namespace std;

int n,m,x2,y2;

int x[15000],y[15000],dx[15000],dy[15000]

;double dis[15000],l[15000]

;int main(

)

cin>>x2>>y2;

dis[x2]

=0;for

(int i=1;iif(dis[dy[j]

]+l[j]

}if(p==0)

break;}

printf(

"%.2lf",dis[y2]);

return 0;

}

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...