原创 uva 820

自己寫的第一個網絡流,用bfs找最短路   輸入的時候兩個點之間可以有多條邊,權值相加就行了   #include<stdio.h> #include<string.h> #include<queue> #define FOR(i,s,e

原创 UVA1008

這題一直以爲是貪心。 每次宿便選一條砍樹最多的方向,怎麼砍都不會虧吧…… 試了大量隨即數據,都沒找到反例,但是交上去就是WA,百思不得其解   之後上網搜,居然真的找到了反例——   .012...3.4...567..8........

原创 USACO COWXOR

終於把這題過掉了!~ 之前一直看不懂網上的解答,而且找了半天沒找到什麼好懂的解法。。 昨天上網的時候看到有人說自己用trie把這題過掉了 於是上網學習trie這個東西 trie是字典樹,每個結點有26個孩子,分別對應26個字母。根到葉對

原创 UVA 10003

這兩天狀態太囧了……看啥啥不會,做啥啥WA……這題就糾結了我好幾小時     題目是經典DP,和矩陣相乘的最小乘法次數那個是一樣的   f[i,j]=min{f[i,k]+f[k,j]}+j-i (k是i,j之間的木棍切割點)   f[0

原创 UVA 10051

這題是dp,狀態爲:第 i 個盒子爲頂, 第 s 個面朝上, 對應的可能的最大高度,記作F[i,s] F[i][s]=1+max{0,F[j,k]}, 期中J>i,且color[i][oppo[s]]=color[j][k] 更新的時候用

原创 UVA 357

經典dp,但是怎麼寫都超時…… 找到別人AC代碼,發現填表只要一次就行了……以後答案直接查表 居然這麼囧……   #include<stdio.h> int coin[5]={1,5,10,25,50}; long long ans; l

原创 UVA166

這題是揹包模型的dp的變形。 硬幣的類型已至,自己有的各種硬幣數量已知,要付的錢已知,假設老闆擁有所有種類硬幣無限多,問你要付那麼多錢最少要交換的硬幣數是多少(我付的錢加老闆找的錢) 首先我的硬幣數目有限,用多重揹包找到每種價格的最少付的

原创 UVA 10330

之前都不知道結點帶容量的最大流怎麼求,今天看了篇國家隊論文受到啓發,原來把一個點拆成兩個點,一個接輸入的邊,一個接輸出的邊,兩點之間的容量是節點的容量,這樣問題貌似就等效了 因爲如果一個流存在於原來網絡,那麼也一定存在於這個新網絡。相反,

原创 UVA 11013

這時道模擬題 做這種題目不能慌,不用急着找最優的實現方法,寫出能解決問題的代碼是首要問題,優化可以之後慢慢來。 其實這種題目一般不是比速度……我完全沒做優化的模擬也就用了0.03秒就過了   #include<stdio.h> char

原创 UVA 10702

這道題是考 bellman-ford 的變形。 變化1:要求的是最長路徑,不是最短路徑 解決方法: 可以把所有的邊改成負數,然後求最短路,之後再改回來。或者直接改relax的比較函數也是可以的 變化2:不是求最短路,而是經過T個邊的最短路

原创 UVA 10525

過了這道AC率較低的題,得意下— — 這題是最短路徑問題,但是比較的是最短時間,時間相同的時候再比較最短路徑 用bellman-ford帶上改過的relax函數就可以了,但是這樣還不夠 論壇上看到帖子說可能一條路被報告2次,應該選擇路程(

原创 UVA 193

  最大獨立集,NP完全問題,考暴力搜索,不用優化就能過 輸出間沒有空行     #include<stdio.h> #include<string.h> #define BLACK 1 #define WHITE 0 #define U

原创 最優二叉搜索樹

給出一個數組,每個數字有一個出現平率。構造最優二叉搜索樹,使得sum{元素的深度*元素的頻率}(叫做二叉搜索樹的權)最小。 本來是個經典O(n^3)的DP: 先把元素按照數組數字排序 f[i][j]=min(f[i][k-1]+f[k+1

原创 heap+dijkstra與SPFA的對比

  heap+dijkstra與SPFA都是單源最短路的高效算法,到底誰比較快一直各有各的說法。於是心血來潮自己測試了下。 測試工具:cena 0.6 系統: windows vista CPU: T2130, 1.86Ghz   所有程

原创 Binomial Heap

最近在比較Dijkstra+各種優先隊列組合的效率。 這個想法源於算法課的作業。作業要我們用現成的庫(LEDA)來比較。我比較出來的結果和預期相差甚遠,懷疑是不是庫的問題。 於是,這次我親手寫了所有的代碼,再比較一次。 Binomial