平面上有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行,...