Codeforces 暑期特訓:我想成為演算法大師 - Week 6
From LI2 Contests Group
Contest 18. Graphs, DFS, BFS
C. Looking for cycle
Problem: C. Looking for cycle
Solution: GitHub Code
visit陣列中,0表示沒進去過,1表示是當前的迴圈,2表示之前已經走過發現沒有 cycle- 若
visit僅為bool,會讓沒有 cycle 的路徑重複走很多遍 1 → 2 → 3 → 4 → 2這樣的 cycle 是2 3 4- 用
parent陣列存 dfs 走的路徑
1 | void solve() { |
E. Bipartite graph
Problem: E. Bipartite graph
Solution: GitHub Code
- 用 bfs 對每個點去跑,如果還沒走過就先設 1,接下來每層再反轉 1 或 2
1 | void solve() { |
J. Mafija
Problem: J. Mafija
Solution: GitHub Code
- 如果
A→B且A是暴徒,則B一定是平民 - 如果
A→B且B是暴徒,則A一定是平民 - 相鄰的兩人不能同時是暴徒,所以最多只能有一半是暴徒(在一個環裡面也是)
- 對於每一個環,先去針對環外面的每條樹,用 DP
最大化暴徒數量,所以要先找到沒有被指到的那些點,也就是
indeg為0- 先處理樹:對於每棵樹的根,在「根是平民」或「根是暴徒」兩種情況下,這棵樹能貢獻的最大暴徒數
- 再處理環:利用樹 DP 的結果,算出每個環上節點的貢獻價值
1 | void solve() { |
Contest 20. DSU
A. Islands
Problem: A. Islands
Solution: GitHub Code
- 題目要求的是前幾座橋蓋完之後所有點都能相通
- 用
pieces來存共有幾個不相連的區塊,當pieces==1的時候就不用再繼續蓋了
1 | void solve() { |
F. Vessels
Problem: F. Vessels
Solution: GitHub Code
arr存n個容器的容量,brr存n個容器了多少的水- 若第
i個容器裝滿,那麼水會流進第i+1個容器裡,還是滿的話就再繼續往下找,所以這裡用 DSU 優化,boss存還沒滿的那個容器idx - 如果流到了
idx為n時,代表流到了地上,就跳出迴圈不用管
1 | void solve() { |
Contest 22. Shortest Paths
C. Rain 2
Problem: C. Rain 2
Solution: GitHub Code
- BFS 從
(0, 0)走到(n-1 ,m-1),用priority_queue維護,距離越短的優先 - 剪枝用
dist存最短加權距離 - 記得開
long long,然後dist的值預設要開夠大(不然會WA)
1 | void solve() { |
D. Roadblock
Problem: D. Roadblock
Solution: GitHub Code
- 先用 Dijkstra 找到
1到n的最短路徑 - 最短路徑用
parent存,後面再從n迴溯到1存到path陣列裡 - 針對這條路徑的每段,都試著將其長度變成
2倍,然後都再做一次 Dijkstra,找到最大的增加長度,最後記得把2倍的長度設定回來
1 | void solve() { |