bzoj3627 JLOI2014 路徑規劃

2022-08-22 11:21:13 字數 2359 閱讀 2126

相信大家都用過地圖上的路徑規劃功能,只要輸入起點終點就能找出一條最優路線。現在告訴你一張地圖的資訊,請你找出最優路徑(即最短路徑)。考慮到實際情況,一輛車加滿油能開的時間有限,所以在地圖上增加了幾個加油站。

地圖由點和雙向邊構成,每個點代表乙個路口,也有可能是加油站或起點終點。有些路口還裝有紅綠燈。由於經過太多的紅綠燈會讓人感到不爽,所以請求在經過不超過k個紅綠燈的情況下,最少平均花費多少時間能從起點到終點。保證起點終點和加油站沒有紅綠燈。

(題目不考慮最壞情況下能否加到油,只考慮平均花費時間的前提下,車能否到達加油站加油)。

第一行輸入5個整數n,m,k,limit,cost,表示有n個點m條邊,車能開limit長的時間,及加油所花時間cost。

接下來n行輸入每個點資訊,包括點的名稱(帶「gas」的為加油站,「start」為起點,「end」為終點),及該點是否有紅綠燈,(a,b表示)(若為a=0則表示沒有,a表示紅燈長,b表示綠燈長)。

接下來m行輸入每條邊資訊,包括邊的起點,終點,邊的名稱,通過該邊所花時長。

保證點和邊名的長度不大於20,只有大小寫字母,數字及『_』組成。

一行輸出最少平均花費時長。

5 8 1 100 10

start 0 0

azhan 10 10

xxgasxx 0 5

bpoint 20 5

end 0 100

start azhan sdf 30

azhan xxgasxx ewfg 20

start end r3tg 200

end azhan 1xq2 70

azhan bpoint gg 10

xxgasxx bpoint kk 30

bpoint end dsg 40

xxgasxx end t_s 100

162.500
共14組資料:

其中3組資料,滿足n<10,m<20,k<5

另有組沒有紅綠燈

所有資料滿足n<=10000,m<=20000,k<=10,加油站<=50

答案保留3位小數

等紅綠燈所花費時間的期望為\(\frac\),這個可以用積分積出來。具體的,我們假設乙個長度為\(a+b\)的週期中紅燈的出現時間為\([0,a]\)這一區間,我們在\(x\)時刻到達的概率是\(\frac\),等待的時間期望為\(\frac\)。那麼總的期望就是

\[\int _0^a\frac\mathrmx=\frac

\]由於加油站很少,我們考慮預處理出從每個加油站出發能到達哪些加油站。注意,這裡我們將起點和終點也視作加油站。那麼這就是乙個分層圖問題,我們設\(d[i][j]\)表示經過了\(i\)個紅綠燈到達\(j\)的最短路,這個東西可以用\(spfa\)輕鬆求出。

現在我們已經知道了每個加油站可以到哪些加油站以及中間需要經過的紅綠燈數,那麼其餘的不是加油站的點都已經沒有用了。我們可以建一張新圖,只保留加油站,得到的仍是分層圖。然後再在新圖上跑一邊\(spfa\)即可得到答案。

#include#define maxn 20010

#define inf 0x3f3f3f3f

#define fir first

#define sec second

#define mkp make_pair

using namespace std;

typedef pairpa;

double d[15][maxn];

bool vis[15][maxn];

mapma;

struct point p[maxn];

struct edge e[maxn << 1];

struct new g[maxn << 1];

int hd1[maxn], cnt1, hd2[maxn], cnt2, n, m, k, l, c, gas[maxn], tot;

inline void add_edge(int from, int to, double v)

inline void add_new(int from, int to, double v, int w)

queue< pa >q;

inline void spfa1(int s)

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

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

} }spfa2(s);

double ans = inf;

for (int i = 0; i <= k; i++)ans = min(ans, d[i][t]);

printf("%.3lf", ans - c);

return 0;

}

BZOJ3627 JLOI2014 路徑規劃

題意 求期望紅綠燈時間下。途徑若干加油站。經過最多若干個紅綠燈,起點與終點的最短路。思路 每乙個有紅綠燈的節點通過時間怎麼算呢?其實t red red 2 red green 然後把這個時間附加到節點的出邊上。隨後我們建立分層圖,第i層表示經過了i個紅綠燈時,從源點到該點的最短路徑長度。假設沒有油量...

BZOJ 2764 JLOI2011 基因補全

題目 題意 給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,配對的規則是a與t配對,c與g配對,新增鹼基的位置與數量不同的方案視為不同,求不同的方案數。0n 2000 題解 可以考慮算出序列t在序列s裡匹配的本質不同方案數,利用dp可以很...

BZOJ3192 JLOI2013 刪除物品

原題位址 自己想的奇葩做法 對於乙個優先順序為x的物品,考察該物品下方優先順序大於x物品的優先順序被分成了多少個連續段 舉個例子,如x 4,該物品下方物品的優先順序有5,6,7,9,10,13,14,19,則段數為4 則該物品需要被移動的次數k 段數 2 優先順序為x 1的物品在該物品下方?1 0 ...