題目鏈結
不愧是中文題b( ̄▽ ̄)d,
拿到題求最小費用,物品和物品存在單向依賴,而且還有地位的限制,情況比較複雜,想到的第一種方法是網路流,不過很難在邊上把對等級的限制體現出來,所以對等級限制我的處理方法是
好了最重要的問題,如何建圖?顯然所有邊的容量都是1,保證不重複走。
不算很慢
;//存放輸入進來的物品數目和替代品資訊
ll pre1[max]
, pre2[max]
, vis[max]
, dist[max]
, minf[max]
, mincost =
0, maxflow =0;
void
addedge
(ll from, ll to, ll cap, ll cost)
//檢查j物品擁有者的地位是否處於[l,r]區間之內
bool
checklevel
(ll j, ll l, ll r)
bool
spfa
(ll s, ll t)}}
}return dist[t]
!= inf;
}void
update
(ll s, ll t)
maxflow +
= minf[t]
; mincost +
= minf[t]
* dist[t];}
void
minflow
(ll s, ll t)
intmain()
}//建圖
//0:n-1 物品節點
//n:起始節點 n+1:終止節點
ll s = n, t = n +
1, level = v[0]
[0].second;
for(
int k = level - m; k <= level; k++
)//只加入地位在 [k,k+m]之間的邊
for(
int i =
1; i < n; i++)}
minflow
(s, t)
; res =
min(res, mincost);}
cout << res << endl;
}然後呢你會發現,我們這個網路流其實流量不是很重要,每次也只找最短的一條增廣路徑,本質上就是乙個spfa的最短路徑,ծㅂծ,,但是我樂意用網路流
測試資料1:1
41000032
28000
35000
100021
4200
300021
4200502
05250
測試資料2:1
51000034
23000
32000
42000
59000
800023
35000
42000
57000
500010
200041
51900501
04000
測試資料3:3
81000036
23000
32000
42000
59000
71000
85008
800023
35000
42000
57000
500011
61000
200041
51900501
0500011
74007
200041
51900803
02950
測試資料4:1
10132400
123400
2550067
00560
0213400
4560
0234500
6700643600
1324
測試資料5:1
41000032
2133
100022
4131
100031
421004
0105
測試資料6:3
51000034
23000
32000
42000
59000
800023
35000
42000
57000
500010
200041
51900501
03950
測試資料7:0
51000034
23000
32000
42000
59000
800023
35000
42000
57000
500040
200031
51900502
03950
poj 1062 昂貴的聘禮
這個題是乙個簡單的樹形dp,只是有乙個地位差限制,可以列舉可行區間,在可行區間裡進行dp.include include include include include include include include include include includeusing namespace st...
poj1062 昂貴的聘禮
做這題代價確實很昂貴,從昨天晚上一直到今天上午都在debug,今天上午提交還出現各種wa。比較明顯的最短路,有幾個地方要注意一下,首先建圖有個地方要注意以下,這題是用臨界矩陣儲存的有向圖,而且是由交換品指向購買品,然後將虛節點設為購買品的價值,最後列舉每乙個可能地位區間di求最短路,因為對於區間 c...
昂貴的聘禮(POJ1062)
這個玩了好久啊,是我第一次寫出這樣的最短路徑。還是參考了其它人的才出來,注意的有 1 是單向圖,2 把不滿足權值的提前全初始化。其實不用topo排序也可的。關鍵 void dfs int k include include include include include include includ...