原创 POJ 1236 (Tarjan+縮點)

題意:對於一個DAG,至少要選多少個點才能從這個點到所有點,至少要添加多少條邊才能從任意一點到所有點。思路:對於第一問,用Tarjan求出強聯通分量,縮點後求出入度爲0的點就是答案。對於第二問,在縮點後求出入度爲0,初度爲0的個數,取最大

原创 POJ 3180 (Tarjan)

題意:給n給點,m條邊,求連通分量>=2的強聯通分量數;思路:直接上模板即可scc_cnt爲SCC的計數器,sccno[i]爲i所在的SCC編號。#include <iostream> #include <algorithm> #incl

原创 POJ 2676 (dfs)

題意:給一個9*9的數獨,其中已經填了一些數了,需要填上剩下的空,如有多解隨意輸出一解即可。思路:由於這題初始給的數很多,所以直接dfs不用剪枝也可以過。數獨需要每一行每一列,9個3*3的區域內不能有重複的數字。對於每一行每一列的判斷很容

原创 POJ 2184 (01揹包)

題意:給出了n頭牛的智力值和幽默值,要求智力值和幽默值和的最大值;思路:這是一個01揹包問題,要麼選要麼不選,但由於智力值和幽默值都存在負值,那麼問題就是怎麼處理負值。我們只需要把數組延長一倍即可。dp[i]代表智力爲i時幽默值的最大值。

原创 hdu 1251

題目:Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字符串爲前綴的單詞數量(單詞本身也是自己的前綴). Input輸入數據的第一部分是一張單詞表,每行一個單詞,單詞

原创 hdu 1247 (Trie)

題意:給一些單詞,問哪些單詞能有另外兩個單詞組成思路:先去找一個單詞的前綴,去除前綴後再去找單詞的後綴#include <iostream> #include <cstring> #include <cstdio> #include <a

原创 POJ 3074(DLX)

同樣是數獨的題,不同於poj 2676和2918,這題給的空白格很多,直接用dfs會超時,需要進一步的優化。自己剪了半天的枝還是超時,搜了題解,發現了一種新的算法Dancing Link X(DLX),關於這個算法,推薦一篇博客https

原创 UVA11732 (Trie)

題意:給n個字符串,讓他們兩兩比較,求比較的次數。如strcmp("than","that"),strcmp("there","the")各需要7次比較。思路:簡單的模擬肯定不行,所以建立字典樹。val數組代表經過該節點的單詞書。添加一個

原创 HDU4099(Trie)

題意:輸入一個數,這個數是斐波那契數列的前綴,求滿足這個前綴的最小的下標。給出的數不超過40位,若滿足這個前綴的最小下標超過100000則輸出-1。思路:將斐波那契的前綴放到字典樹中,由於兩數相加有可能會進位,我們把斐波那契的前60位放到

原创 POJ 2186 (Kosaraju)

題意:每頭牛都想成爲牛羣中的紅人,現在又N頭牛和M個有序對(A,B)。(A,B)表示牛A認爲牛B是紅人。該關係具有傳遞性,所以如果A認爲B是紅人,B認爲C是紅人,則A認爲C是紅人。求被其他所有牛認爲是紅人的牛的總數。思路:假設有兩頭牛A和

原创 CodeForces - 1051D Bicolorings(dp)

題意:給定一個2*n的矩形,有黑白兩種顏色,定義兩個小方格相鄰如果他們的邊界挨着並且顏色相同。求分成k個部分的方案數對 998244353取模。 思路:dp[i][j][2]代表第i列分成了j塊,此時第i列的狀態爲0或1. 0代表第i列顏

原创 hdu 6305(多校第一場)

題意:定義RMQ(A,l,r)爲序列A滿足A[i] = max(A[l],A[l+1],......,A[r])中最小的i。如果RMQ(A,l,r)= RMQ(B,l,r),則稱他們相似。給出A序列,B序列中元素爲0-1的實數,求出滿足R

原创 hdu 6299 (多校第一場)

題意:給出一些字符串,重新組合,使括號的匹配數量最多 這道題場上沒能出,當時看了一眼,關於括號的,以爲是個dp,就沒有再去做這道題。 這道題事實上是個貪心,先把已經匹配好的括號數量統計出來。剩下的括號往兩邊堆,右括號往左邊堆,左括號往右邊

原创 hdu 6390 (歐拉函數+莫比烏斯反演)

給出一個表達式   求解 首先,設p爲a,b共同的質因數 phi(n) = p^α = (p-1)*p^(α-1) phi(ab) = (p-1)*p^(α1+α2-1) phi(a) = (p-1)*p^(α1-1) phi(b) =

原创 poj 1077 (康託展開+bfs)

這是一個八數碼問題,正好學習了康託展開,就做了這題,和hdu1043很像。康託展開並不難理解,其實就是一種hash。先上模板方便以後自己看。康託展開:int Contor(int str[],int n) { int ans =