題解 JLOI2011 飛行路線

2022-05-05 19:36:07 字數 2117 閱讀 7398

目錄分析

注意事項

code

執行限制:時間不超過 \(1.00\ \textrm\),空間不超過 \(128\ \textrm\)。

alice 和 bob 現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在 \(n\) 個城市設有業務,設這些城市分別標記為 \(0\) 到 \(n−1\),一共有 \(m\) 種航線,每種航線連線兩個城市,並且航線有一定的**。

alice 和 bob 現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次旅行也推出優惠,他們可以免費在最多 \(k\) 種航線上搭乘飛機。那麼 alice 和 bob 這次出行最少花費多少?

第一行三個整數 \(n\)、\(m\)、\(k\),分別表示城市數,航線數和免費乘坐次數。

接下來一行兩個整數 \(s\)、\(t\),分別表示他們出行的起點城市編號和終點城市編號。

接下來 \(m\) 行,每行三個整數 \(a\)、\(b\)、\(c\),表示存在一種航線,能從城市 \(a\) 到達城市 \(b\),或從城市 \(b\) 到達城市 \(a\),**為 \(c\)。

輸出一行乙個整數,為最少花費。

保證 \(0\le s,t,a,b\le n\),\(a\ne b\),\(0\le c\le 10^3\)。

題意很明確,給定一張圖,一條路徑上最多可以使 \(k\) 條邊權值為 \(0\),求最短路。

請注意這道題與 [usaco18jan-sliver] telephone lines 的區別。這道題的最短路是求和,而那一道題的最短路則是取最大值。這兩個區別導致這兩題本質不同。

由於有用了多少條邊的資訊,我們可以構造分層圖。第 \(i\) 層(\(0\le i\le n\))為用了 \(i\) 次使邊權為 \(0\) 的操作。

只需要使起點為 \((s,0)\),求解 \((t,0),(t,1),\cdots ,(t,k)\) 的最短路並去最小值即可。

這道題的圖是無向圖,注意加雙向邊,同時開兩倍空間。

圖論題,尤其是最短路的**還是比較好敲的,注意一下細節就行了。

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

const int max_n = 10000, max_m = 50000, max_k = 10, max_l = max_k + 1;

struct node

bool operator<(const node& n) const };

int hd[max_n*max_l], des[max_m*(max_k+max_l)*2], val[max_m*(max_k+max_l)*2], nxt[max_m*(max_k+max_l)*2], e_cnt = 0; // 存圖(2*空間)

int dis[max_n*max_l], n;

bool vis[max_n*max_l] = {};

priority_queueq;

inline int mk(int id, int ly) // 生成節點編號

#define gc getchar

inline int read() // 快讀

if (c == '-')

while (isdigit(c))

return n * t;

}#undef gc

void add_edge(int s, int t, int v)

int main()

add_edge(mk(ta, k), mk(tb, k), tc); // 注意總共有 k+1 層

add_edge(mk(tb, k), mk(ta, k), tc);

} q.push(node(mk(s, 0), 0));

dis[mk(s,0)] = 0;

while (!q.empty()) // 最短路

} }

for (int i = 0; i <= k; i++)

if (dis[mk(t,i)] < ans)

ans = dis[mk(t, i)]; // 統計最小答案

printf("%d\n", ans); // 輸出

return 0; // 然後就 ac 了、

}

JLOI2011 飛行路線

提交傳送門 師兄們覺得我是不是很挫啊,做了1天多才做出這道裸spfa 人家只是試著打了一下拆點而已嘛 就是spfa只是2維而已 d i 0 代表第i個點 不用免費次數時得最小距離 d i 1 代表第i個點 用免費次數時得最小距離 就很簡單了是不是?description alice和bob現在要乘飛...

JLOI2011 飛行路線

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

JLOI2011 飛行路線

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