目錄分析
注意事項
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現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次...