給定一個圖,N個頂點,M條邊,N值極小,對於每一條邊,有ai,bi,ci,pi,ri這幾個參數,表示這條邊從ai到bi,如果之前經過了ci,那麼費用是pi,否則費用為ri,求從1到N的最小費用。用f[i,j]為節點,i表示當前在哪個點,j轉化為位元後為0位表示未經過這一點,為1這表示經過了這一點,進行SPFA即可{對j的解釋,11:1011,表示經過1,3,4這三個點而沒有經過2}View Code 1 program pku3411(input,output); 2 type 3
求一個圖的最小產生樹,用了prim,0ms,但前面WA了幾次,這裡進一步理解了prim,外部迴圈i只是控制次數,內部不用看i與j的值的關係,把d賦值成0,表示在樹裡,節省了一個布爾數組。View Code 1 program pku1258(input,output); 2 var 3 f : array[0..200,0..200] of longint; 4 d : array[0..200] of longint; 5 n :
有兩台機器A,B,分別有n,m個進程,有k個任務,每個任務要麼在A的x進程上完成,要麼在B的y進程上完成,但機器換進程要時間,求完成方案下的最短時間。最小覆蓋問題,通式:方案有兩個,作為二分圖的對立點,而任務為點,完成每一個任務的兩種方案連邊,求最大匹配即可,因為“最小覆蓋=最大匹配”很不理解輸入裡面的那個i有什麼用??View Code 1 program pku1325(input,output); 2 var 3 f : array[0..201,0..201] of
看到這個標題後我毅然交上了CTSC的樹形DP,WA的結果不言而喻,囧仔細讀題後有兩種思路:1.把每個課程拆成兩個點,對於時間發生矛盾的課之間(i‘-->j)(i-->j')下面應該是一個最大獨立集問題了,點數減匹配數即可這個思路沒有實踐,如果有錯,請指出。2.很多人都用這種方法,二分圖一邊是84個時間點,另一邊是課程,連邊之後求最大匹配即可View Code 1 program pku2239(input,output); 2 var 3 f : array[0..100,
求一個圖的最小產生樹,其中某些邊不收費(可以這樣理解)。這次用kruscal打的,對於不收費的邊先全部加入,再維護即可。View Code 1 program pku2421(input,output); 2 var 3 father : array[0..200] of longint; 4 f : array[0..200,0..200] of longint; 5 x,y,w : array[0..40000] of longint;
典型的2-SAT問題,每個數要麼是0,要麼是1,直接連邊Tarjan即可如果用x表示第x個數取0,x+n表示第x個數取1,注意在x and y=1 時連(x--->x+n) (y--->y+n),表示x必須取1,當x取到0時,由於與1有邊相連,在一個強連通裡,無解!View Code 1 program pku3678(input,output); 2 type 3 node = ^link; 4 link = record 5
有三個矩陣A,B,C,問A*B是否C,(n^3)的演算法會逾時。構造一個n*1的矩陣,由A*B=CA*B*X=C*XA*(B*X)=C*X那麼在(n^2)的時間內就能判定一次。View Code 1 program pku3318(input,output); 2 var 3 x,y,z : array[0..501,0..501] of int64; 4 left,right,answer1 : array[0..501] of int64; 5 n
一道線段樹的典型應用,標記真強大,沒事怕錯就多下放幾次標記,反正沒什麼錯。View Code 1 program tree_line(input,output); 2 type 3 node = record 4 sum,mark : int64; 5 left,right,x,y : longint; 6 end; 7 var 8 tree
把質因子只有2,3,5的數稱為Ugly數,求第k大的Ugly數。(1是第一個)用堆儲存數字,開始堆中只有1,每次刪除最小值,把最小值的2倍,3倍,5倍插入到堆中,執行k次就得到結果。注意要判重,用個hash就行,有點羨慕C++的map了。View Code 1 program pku1338(input,output); 2 type 3 longint = int64; 4 node = ^link; 5 link = record 6
有n頭牛,m個牛欄,其中每頭牛都有自己願意去的牛欄,求牛和牛欄的最大匹配。簡單的二分圖裸題,居然調了1節課,資料會陰人啊!!每行第一個數是說這一行接下來有多少個數,可是這些數完了這一行還有數,用read就悲催了!View Code 1 program pku1274(input,output); 2 var 3 f : array[0..301,0..301] of boolean; 4 v : array[0..301] of boolean; 5 lk :
題目自己去看,網上的題解也是一堆一堆的,但這絕對是練習tire,歐拉路徑和並查集的一道經典題目,還是重複一下老掉牙的流程 1.用tire給每一個顏色字串編號。 2.先判斷是否是歐拉路徑(沒有或只有兩個奇點)。 3.用並查集判斷圖是否是連通的。過了範例之後,先測一下這組資料:a bb cc ad ee ff
本題誰都會做,在這裡分析一下各個方法。1.按照說明類比,不再累述。2.pascal同學有內建函數swap,但要注意資料類型了,longint不夠2^32,int64不符合函數要求,只能用cardinal。3.最有水平的解法,位元運算(n shr 16) or (n shl 16) 就是結果了。View Code 1 program p1201(input,output); 2 var 3 x:dword; 4 begin 5