1. 程式人生 > >luogu P1744 采購特價商品

luogu P1744 采購特價商品

mda 采購 style div 一半 直線 floyd turn names

實話說我本來想找SPFA的題,結果我硬生生的把這道題做成了Floyd

先來看題,我們會發現如果把他所給的變量都輸入,那麽會發現用Floyd的解法,輸入占了main函數的一半長度。。。

題目分為兩步走:

1.根據題意,我們可知是讓我們算兩點間直線距離,那我們就可以順理成章的去用我們學過的——兩點間距離公式!

2.就要看Floyd的了,我們知道了兩點間的距離,那麽我們就用Floyd找出最短的哪條路徑(直接貼板子就行)

最後一定要記住,保留兩位小數!

#include<bits/stdc++.h>
using namespace std;
const
int N = 1100; int n,m,s,t; int a,b; double f[N][N]; double x[N],y[N]; int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=2020040222; for(int i=1;i<=n;i++) cin>>x[i]>>y[i]; cin>>m; for(int i=1;i<=m;i++) { cin
>>a>>b; f[a][b]=f[b][a]=sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])); } cin>>s>>t; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); printf("%.2lf",f[s][t]);
return 0; }

luogu P1744 采購特價商品