原创 並查集應用:入門級

題目引用自洛谷。   若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y

原创 過河卒問題:簡單動規

#include #include #include #include using namespace std; const int hmx[8]={-2,-1,1,2,2,1,-1,-2}; const int hmy[8]=

原创 數據結構:從堆到“漏斗”

問題引入:黑匣子 Black Box是一種原始的數據庫。它可以儲存一個整數數組,還有一個特別的變量i。最開始的時候Black Box是空的.而i等於0。這個Black Box要處理一串命令。 命令只有兩種: ADD(x):把x

原创 最小生成樹Prim與Kruskal算法的比較

最小生成樹是圖論問題中很基本的一個操作。常用的算法有Prim和Kruskal兩種算法。本文對這兩種算法稍作區別與討論。 Prim算法是依賴於點的算法。它的基本原理是從當前點尋找一個離自己(集合)最近的點然後把這個點拉到自己家來(

原创 Dijkstra最短路徑算法的優化

在傳統的Dijkstra算法中,我們不難發現,大量的時間被用於遍歷d[]數組。 因此,我們可以通過一個小頂堆來替代這個遍歷過程。優化後的算法複雜度爲O(v*lgn)。 #include <cstdio> #include <cs

原创 動態規劃基礎題:機器分配

題目描述 總公司擁有高效設備M臺,準備分給下屬的N個分公司。各分公司若獲得這些設備,可以爲國家提供一定的盈利。問:如何分配這M臺設備才能使國家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原則:每個公司有權獲得任意數

原创 快速冪算法基礎

快速冪算法主要應用於求冪模的問題。 我們可以先定義一個問題: 如何求2^31的最後一位數?顯而易見,結果當然是8.這個問題是具有特殊性的,可以用某些特殊解法來處理。但是作爲我們對快速冪的學習例程來看,我們需要從特殊問題中尋找一

原创 動態規劃基礎題:低價購買(最長下降子序列)

題目描述 “低價購買”這條建議是在奶牛股票市場取得成功的一半規則。要想被認爲是偉大的投資者,你必須遵循以下的問題建議:“低價購買;再低價購買”。每次你購買一支股票,你必須用低於你上次購買它的價格購買它。買的次數越多越好!你的目標是

原创 逆序對在OI中實際問題裏的細節處理

之前寫過一篇關於逆序對的描述文章: http://blog.csdn.net/mollnn/article/details/52503183 如果需要了解與逆序對有關的信息,見上文。 本文主要交代,在OI中使用逆序對算法需要注

原创 C++STL中String類的分析與運用

[Mollnn.Fan原創,轉載請註明出處] 本來以爲有了String類,所有的字符串操作都變得非常簡單。然後,在某次實際測試中反應出了很大的問題。原本只涉及到區區一個replace,在有參考資料的狀態下10分鐘輕鬆解決的問題,

原创 並查集初階:暢通工程問題

暢通工程問題是一個很經典的並查集問題。不是說這一題不可以用圖論來解決,而是這題用並查集的思想省時省力,何樂而不爲? 並查集類的補充:Count函數 在我之前的一篇文章中,用一個類封裝了並查集的基本操作。而現在我們針對在暢通工程中

原创 並查集初探(一) 核心代碼

在本文中,我們將並查集的基本操作封裝爲一個類,以便後面研究並查集的相關問題。 class UnionFindSet { public: int father[UFS_LIMIT]; UnionFindSet() {

原创 歸併排序與逆序對

歸併排序是一種運用了二分算法的排序,其基本原理可以理解爲拆分對合並。利用歸併排序可以便捷地求出逆序對的個數。參考代碼如下所示: #include <iostream> #include <cstring> #include <cm

原创 秦九韶算法——高速的多項式運算解決方案

我們來設想一下,有一個次數爲5000的多項式,需要10000次代入值查詢,用傳統的計算方法,時間複雜度有多高? 每一次帶入,根據需要2500*5000=1.25*10^7次運算,可以視爲O(n^2) 設帶入次數爲M,則複雜度爲O(m·n^

原创 【挫紀】多重揹包問題的優化細節

衆所周知多重揹包問題的一個重要優化:二進制分解。 然而在二進制分解時,有細節需要注意。 一、分解順序問題 有時候腦子抽筋,會突然用位運算移位來直接獲取分解結果。這種方法是不可取的,例如5=101,按照移位分解的方法就會分解爲4