飛行計畫 最短路有點轉換

2021-10-05 10:22:47 字數 1902 閱讀 9191

題目描述

已知地圖上一共有n個機場,alice要從1號機場飛到n號機場。

從i號機場飛行到j號機場需要消耗dist(i,j)個單位的油量,其中 dist(i,j)為i號機場和j號機場之間的歐幾里得距離。

alice可以選擇在任意機場起降和加油。飛機油箱最多可以儲存u單位的燃油。

考慮到可能遇到的極端天氣,某些機場在某些時候不具備降落的條件。所以出於安全的考慮,當他飛到乙個機場的時候,必須保證飛機剩下的油足以飛到離他最近的機場。

假設一次起飛和降落分別需要花費a秒和b秒的時間,加1單位的油需要花費c秒的時間,飛行1單位的距離需要花費d秒的時間,請問 alice最早什麼時候可以到達終點?

飛機初始的油量為0,也就是說,飛機需要先在起點加油再起飛。

輸入 第一行6個整數n,a,b,c,d,u。

接下來n行,每行兩個整數xi,yi表示第i個機場的座標。

輸出 對於每組資料輸出一行乙個數,表示最早的到達時間,只要你的答案和標準答案相對誤差或者絕對誤差在10

-5以內就算通過

資料保證有解

樣例輸入 copy

4 1 1 1 1 3

1 02 0

3 04 0

樣例輸出 copy

11

題解:粗體部分。

當從第乙個機場起飛。花費為起飛時間+降落時間+加油時間+飛行時間。

飛行時間為兩點的歐幾里得距離。

加油時間由於粗體字可知,為(離目的地最近的那個點的距離+此時兩個點的距離)*c;

當飛出第乙個點外。我們還是需要多加油,但是前面的點我們已經足夠飛到當前點,所以我們的代價位(離目的地最近的那個點的距離+此時兩個點的距離-離起點最近的距離)*c;

注意 double

#pragma gcc optimize(3 , "ofast" , "inline")

#include #define rep(i , a , b) for(register int i=(a);i<=(b);i++)

#define rop(i , a , b) for(register int i=(a);i<(b);i++)

#define per(i , a , b) for(register int i=(a);i>=(b);i--)

#define por(i , a , b) for(register int i=(a);i>(b);i--)

using namespace std;

int n,s;

typedef long long ll;

typedef pairpi;

const int n =1111;

const double eps = 1e-8;

double dist[n];

double dis[n];

pi p[n];

ll inf=ll(1e10);

bool inque[n];

struct edge;

struct youxian

};vectore[n];

void dil()

s=1;

dis[s]=0;

priority_queueq;

q.push();

while(!q.empty()));}}

}}double dd(int x,int y)

int main()

rep (i,1,n) }}

rep(i,2,n) );

}rep(i,2,n) );}}

dil ();

printf ("%f\n",dis[n]);

return 0;

}

BZOJ2763 飛行路線(最短路)

bzoj alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n 1,一共有m種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次旅行...

BZOJ2763 飛行路線(最短路)

bzoj alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n 1,一共有m種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次旅行...

c 遍歷所有點且距離最短 最短路徑之A 演算法

在求最短路徑問題是,如果去除負權邊的情況,可以使用dijkstra演算法來替代貝爾曼 福特演算法,複雜度更優。接下來介紹的a 演算法,也是一種相對更優的演算法。看下圖 使用dijkstra演算法來計算ab的最短路徑,基本上要把所有的點 邊都遍歷,才能得到最短路徑 綠線。但是站在人類的角度來看,藍線是...