原创 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