BZOJ3627 JLOI2014 路徑規劃

2021-09-08 13:05:40 字數 1376 閱讀 2889

題意:求期望紅綠燈時間下。途徑若干加油站。經過最多若干個紅綠燈,起點與終點的最短路。

思路:每乙個有紅綠燈的節點通過時間怎麼算呢?其實t=red*red/2/(red+green),然後把這個時間附加到節點的出邊上。

隨後我們建立分層圖,第i層表示經過了i個紅綠燈時,從源點到該點的最短路徑長度。

假設沒有油量限制。那麼我們直接跑最短路即可了。

注意到加油站非常少,於是我們列舉以每乙個加油站為起點,向其它加油站經過若干個紅綠燈的最短路徑。

若此長度不大於最大油量,那麼能夠直接轉移。

我們用上述資訊構造新圖,依然是分層圖,但是每一層僅有50個點,且沒有油量限制。

一次最短路出解。

code:

#include #include #include #include #include #include #include #include using namespace std;

typedef double f2;

#define _abs(x) ((x)>0?

(x):-(x)) #define n 10010 int n, m, dep, lim, cost; bool isgas[n]; f2 length[n]; mapm; int id, s, t; int point_id, lab[11][n]; struct node bool operator < (const node &b) const }; void swap(node &x, node &y) struct heap void up(int x) void down(int x) void addedge(int a, int b, f2 _len) void spfa(int s) if (tmp.lab == 0) break; inpath[tmp.lab] = 1; for(j = head[tmp.lab]; j != -1; j = next[j]) if (dis[end[j]] > dis[tmp.lab] + len[j]) } } }g1, g2; void getaddedge(int a, int b, int len) int gases[101], top; int main() g1.reset(); g2.reset(); int a, b, len; for(i = 1; i <= m; ++i) isgas[s] = isgas[t] = 1; for(i = 1; i <= n; ++i) if (isgas[i]) gases[++top] = i; for(i = 1; i <= top; ++i) } g2.spfa(lab[0][s]); f2 res = 1e10; for(i = 0; i <= dep; ++i) res = min(res, g2.dis[lab[i][t]]); printf("%.3lf", res); return 0; }

bzoj3627 JLOI2014 路徑規劃

相信大家都用過地圖上的路徑規劃功能,只要輸入起點終點就能找出一條最優路線。現在告訴你一張地圖的資訊,請你找出最優路徑 即最短路徑 考慮到實際情況,一輛車加滿油能開的時間有限,所以在地圖上增加了幾個加油站。地圖由點和雙向邊構成,每個點代表乙個路口,也有可能是加油站或起點終點。有些路口還裝有紅綠燈。由於...

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 ...