求最大流的Relabel-to-Front演算法

除了用各種方法在剩餘網路中不斷找增廣路(augmenting)的Ford-Fulkerson系的演算法外,還有一種求最大流的演算法被稱為壓入與重標記(Push-Relabel)演算法。它的基本操作有:壓入,作用於一條邊,將邊的始點的預流儘可能多的壓向終點;重標記,作用於一個點,將它的高度(也就是label)設為所有鄰接點的高度的最小值加一。Push-Relabel系的演算法普遍要比Ford-Fulkerson系的演算法快,但是缺點是相對難以理解。Relabel-to-Front使用一個鏈表儲存溢

位元運算簡介及實用技巧(一):基礎篇

什麼是位元運算?    程式中的所有數在電腦記憶體中都是以二進位的形式儲存的。位元運算說穿了,就是直接對整數在記憶體中的二進位位進行操作。比如,and運算本來是一個邏輯運算子,但整數與整數之間也可以進行and運算。舉個例子,6的二進位是110,11的二進位是1011,那麼6 and 11的結果就是2,它是二進位對應位進行邏輯運算的結果(0表示False,1表示True,空位都當0處理):     110AND

Google在MIT發布的難題

近日,Google Jobs在MIT校園內到處張貼著一份密碼,企圖在MIT校園裡的一群變態中找出幾個最變態的破密大牛。密碼上面附文說,如果你能破解這份密碼,你在Google會很有前途。據說,這份密碼包含了一個Google Jobs的電話號碼,解開密碼的人可以通過此電話留下自己的個人資訊。目前,還沒有人破解出這段密碼來。     想要自己試一試的同學可以參看下面的高清無碼版:

uva147 – Dollars——-水題(精度注意)

#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define inf 0x7fffffff#define N 6005#define MIN 1e-11#define M 100#define LL long longusing

位元運算簡介及實用技巧(二):進階篇(1)

二進位中的1有奇數個還是偶數個    我們可以用下面的代碼來計算一個32位整數的二進位中1的個數的奇偶性,當輸入資料的二進位表示裡有偶數個數字1時程式輸出0,有奇數個則輸出1。例如,1314520的二進位101000000111011011000中有9個1,則x=1314520時程式輸出1。var   i,x,c:longint;begin   readln(x);   c:=0;   for i:=1 to 32 do   begin      c:=c + x and 1;      x:=

判定被7整除的簡易方法

 判斷一個數的整除性對於某些除數來說是一件非常容易的事,比如2、3、4、5、6、8、9、10、11、12、15……    但是對於7來說一直是一個難題,而判定是否被7整除在數字運算中又比較常用。我剛看到一種判定能否被7整除的方法,在這裡寫一下。    比如,我們要看86415能否被7整除。首先我們把它從個位開始往左邊走兩個數字一組劃分開來,這樣,86415就劃分成8 64 15;然後,從左開始“一加一減找餘數”:    6      

不用除法,如何求n個數的最小公倍數

 下面給出一種演算法,該演算法只需要使用加法運算和比較運算就可以求出n個數的最小公倍數:每一次操作都把當前最小的那個數加上它的初始值,直到所有數都相等為止。下面這個列表顯示了用這個演算法尋找30, 12, 18三個數的最小公倍數的全過程。初始時12是三個數中的最小數,於是該數加上12;接下來18成了最小的數,於是該數加上18變成了36;此時第二個數24又變成了最小數,於是再加上其對應的初始值12;以此類推直到三個數都變成相同的數180為止,這個180就是30, 12, 18的最小公倍數。30 1

位元運算簡介及實用技巧(四):實戰篇

 下面分享的是我自己寫的三個代碼,裡面有些題目也是我自己出的。這些代碼都是在我的Pascal時代寫的,恕不提供C語言了。代碼寫得並不好,我只是想告訴大家位元運算在實戰中的應用,包括了搜尋和狀態壓縮DP方面的題目。其實大家可以在網上找到更多用位元運算最佳化的題目,這裡整理出一些自己寫的代碼,只是為了原創系列文章的完整性。這一系列文章到這裡就結束了,希望大家能有所收穫。    Matrix67原創,轉貼請註明出處。Problem : 費解的開關題目來源    06年NOIp類比賽(一) by

漫話進位制

  人有十個手指,用手指的伸屈來計數非常方便。但一旦對象的數目超過10個了,手指頭就不夠用了。當然,有人會想到還有腳趾頭。搬弄腳趾頭是不現實的,數手指頭只需要站著比劃一下就可以了,數腳趾頭還需要坐下來慢慢研究。一種好的方法是每次數完了十個指頭後在什麼地方做一個標記,比如在地上放一個木棒。人們可以把這根木棒想像成一個“大指頭”,它相當於十個指頭。這樣,我有37個MM就被表示成了地上3個木棒加上我7個手指頭。哈哈,你的MM數只有兩根木棒加4個手指頭,於是我的MM比你的多。久而久之,人們就只接受0到9

求最大權二分匹配的KM演算法

最大權二分匹配問題就是給二分圖的每條邊一個權值,選擇若干不相交的邊,得到的總權值最大。解決這個問題可以用KM演算法。理解KM演算法需要首先理解“可行頂標”的概念。可行頂標是指關於二分圖兩邊的每個點的一個值lx[i]或ly[j],保證對於每條邊w[i][j]都有lx[i]+ly[j]-w[i][j]>=0。如果所有滿足lx[i]+ly[j]==w[i][j]的邊組成的匯出子圖中存在一個完美匹配,那麼這個完美匹配肯定就是原圖中的最大權匹配。理由很簡單:這個匹配的權值之和恰等於所有頂標的和,由於

素數與素性測試

 一個數是素數(也叫質數),若且唯若它的約數只有兩個——1和它本身。規定這兩個約數不能相同,因此1不是素數。對素數的研究屬於數論範疇,你可以看到許多數學家沒事就想出一些符合某種性質的素數並稱它為某某某素數。整個數論幾乎就圍繞著整除和素數之類的詞轉過去轉過來。對於寫代碼的人來說,素數比想像中的更重要,Google一下BigPrime或者big_prime你總會發現大堆大堆用到了素數常量的程式碼。平時沒事時可以記一些素數下來以備急用。我會選一些好記的素數,比如4567, 124567, 321456

10132 – File Fragmentation——水題

#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define inf 0x7fffffff#define N 300#define MIN 1e-11#define M 10000#define LL long

位元運算簡介及實用技巧(三):進階篇(2)

n皇后問題位元運算版    n皇后問題是啥我就不說了吧,學編程的肯定都見過。下面的十多行代碼是n皇后問題的一個高效位元運算程式,看到過的人都誇它牛。初始時,upperlim:=(1 shl n)-1。主程式調用test(0,0,0)後sum的值就是n皇后總的解數。拿這個去交USACO,0.3s,暴爽。procedure test(row,ld,rd:longint);var      pos,p:longint;begin{ 1}  if row<>upperlim then{ 2}

357 – Let Me Count The Ways—水題–資料類型long long

#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define inf 0x7fffffff#define N 30005#define MIN 1e-11#define M 10000#define LL long

825 – Walking on the Safe Side——水題(注意輸入方式)

在輸入上WA了很多遍,主要是因為兩個數之間可能隔了不止一個空格,之前全都按照一個空格來算的。#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define inf 0x7fffffff#define N 105#define

關於next_permutation函數的類比!

現在有一道很簡單的題目,那就是輸出1——n的所有排列數!比如說,輸入n=5;那麼要求求出1,2,3,4,5這幾個數所有的排列數!c++中有一個next_permutation函數,它包含在algorithm標頭檔中,可以方便的求出所有的排列數,可是你知道它是怎麼實現的嗎?現在,我對那個函數進行了簡單的類比,類比函數如下:/**************************輸出所有排列數的非遞迴演算法,經過演算測試,可行!類比next_permutation函數! 說簡單一點,用 1,2,3,4

同餘運算及其基本性質

  100除以7的餘數是2,意思就是說把100個東西七個七個分成一組的話最後還剩2個。餘數有一個嚴格的定義:假如被除數是a,除數是b(假設它們均為正整數),那麼我們總能夠找到一個小於b的自然數r和一個整數m,使得a=bm+r。這個r就是a除以b的餘數,m被稱作商。我們經常用mod來表示取餘,a除以b餘r就寫成a mod b =

求最大流的使用距離標號的最短增廣路演算法

求最大流有一種經典的演算法,就是每次找增廣路時用BFS找,保證找到的增廣路是弧數最少的,也就是所謂的Edmonds-Karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過V*E次,每次BFS的時間都是O(E),所以Edmonds-Karp的時間複雜度就是O(V*E^2)。如果能讓每次尋找增廣路時的時間複雜度降下來,那麼就能提高演算法效率了,使用距離標號的最短增廣路演算法就是這樣的。所謂距離標號,就是某個點到匯點的最少的弧的數量(另外一種距離標號是從源點到該點的最少的弧的數量,本質上沒什麼區

牛B的Regex:素數判定與線性方程求解

  今天又學到一個牛B東西。你相信嗎?Regex竟然可以用來判定素數,甚至可以用來解方程!下面這段Regex可以用來判斷,一個字串的長度是否為合數(假設這個字串裡全是字元'1'):^1?$|^(11+?)/1+$    不信的話,把下面這段代碼複製到你瀏覽器的地址欄裡運行一下,True表示這個數為合數,False表示這個數為素數:javascript:var st="1";for(var i=2;i<100;i++)document.write(i," ",/^1?$|^(11+?)/1+

10534 – Wavio Sequence—使用nlgn實現的

#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define inf 0x7fffffff#define N 10000#define MIN 1e-11#define M 100#define LL long

總頁數: 61357 1 .... 17842 17843 17844 17845 17846 .... 61357 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.