原创 USACO 4.2.1 iSap + gap優化

關於網絡流的增廣路系列算法有很多種,其中dinic和iSap是時間效率和代碼複雜度平衡上比較優秀的兩種算法,而兩種算法在增廣時的思路基本一致並且iSap算法具有更優的時間效率和程序競賽上的應用範圍爲更廣,同時相比於預流推進代碼實現

原创 La3713 Astronauts 2-Sat

題目大意: 有A, B, C三個任務分配給n個宇航員, 其中每個宇航員要被分配一個任務。所有年齡大於平均年齡的宇航員可以選擇A, C兩種任務,其餘人只能選擇B, C兩種任務, 同時這n個宇航員中有m組矛盾, i 和 j 之間矛盾

原创 UVa 11374 Airport Express

題目大意: 給你n個點和起點終點,再告訴你m條經濟線路和k條商業線路,經濟線路可以無限制經過,但商業線路只能乘坐一次,問從起點到達終點的最短距離和路徑,並輸出在什麼位置換成商業線路。 分析: 枚舉每一條商業線路, 計算在當前

原创 La3211 Now or later 2-Sat

題目大意: 有n架飛機需要着陸,每架飛機有早着陸和晚着陸兩種選擇,你要爲這些飛機安排着陸計劃,使得任意兩架飛機的着陸時間間隔的最小值儘量大。 分析: 首先,對於這種最小值最大化大問題,我們很自然的會想到二分答案的方法,對於每

原创 La5135 Mining your own Business

題目大意: 給你n條邊,讓你添加逃生通道,使得不論刪除某一個點之後,任何一個點都能到達至少一個逃生通道。 分析: 若任意一個雙連通分量中有兩個割頂,因爲割頂是與其他雙連通分量的交點,所以我們只需要考慮只有一個割頂的雙連通分量

原创 La 4080 Warfare and logistics Dijkstra

題目大意: 給定n個點,m條邊的無向圖, 定義c爲任意兩點間的最短路之和, 即 c=∑w(i,j)|i∈V,j∈V 求初始時的c與刪去任意一條邊後的c’的最大值。 分析: 對於最初始時的c, 我們可以通過每次計算以某個

原创 UVa 10917 A Walk through the forest

題目大意: 給你n個點m條邊的無向圖, 問從起點(1號點)到達終點(2號點)的總路徑數量(要求從每個點u走到下一個點v時滿足:v到終點的距離小於u到終點的距離。 分析: 從起點出發到每個點的最短路徑可以用一次Dijkstra

原创 La4287 Proving Equivalences

題目大意: 給你n個命題和m組推導(單向推導), 問至少需要再做幾次推導能夠使得任意兩個命題之間等價。 分析: n個命題全部等價,即如果將每個命題抽象成點,那麼已知的推導就是在兩點之間連了一條有向邊,要使得所有的命題全部等價

原创 La3523 Knights of the round table

題目大意: 給你n個人和m組關係,每組關係表示兩個人相互憎恨,而且相互憎恨的人不能在參加一場會議相鄰着坐,而且每次會議參加的人數必須爲奇數,問最多有多少人不能同時參加一場會議。 分析: 對於每一個人而言,他兩邊坐的人只能是與

原创 UVa 10537 The Toll! Revisited! Dijkstra最短路

題目大意: 告訴你n條邊構成的村莊和城鎮構成的圖,每到達一個村莊減少1個單位的貨物,到達一個城鎮要減少[(wi+19)/20] 個貨物,問到達終點時要有p個貨物,從起點起應至少攜帶多少貨物,並求字典序最小的的路徑。 分析:

原创 Uva 11324 The Largest Clique

題意: 給你一張有向圖G, 求一個最大的節點集,使得該節點集中任意兩個點u, v,滿足:u可以到達v, 或者v可以到達u(u、v相互到達也可以)。 分析: 在最優的方案中,每一個強連通分量中的點要麼都選,要麼都不選,那麼我們

原创 淺談基於隨機性算法的素數判定

引:考慮這樣的一個問題 判斷一個long long範圍內的數是否是素數。 引理1-1: ap≡a(modp)|(a,p)=1 其實這就是熟悉的Fermat小定理了~~ 引理1-2: 對於 a2≡1(modn)|n爲素數 的解

原创 Radix-2 Recursive-FFT

#include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int maxl = 300000 + 10; const double PI

原创 Radix-2 Iterative-FFT

#include<bits/stdc++.h> using namespace std; const double PI = acos(-1.0); const int maxn = 300000 + 10; int n, m, bas

原创 拓展Lucas定理求C(n, m) % p

#include<bits/stdc++.h> using namespace std; const int maxn = 100000 + 10; typedef long long LL; LL Pow(LL n, LL m, LL