problem description
度度熊參與了喵哈哈村的商業大會,但是這次商業大會遇到了乙個難題:
喵哈哈村以及周圍的村莊可以看做是一共由n個片區,m條公路組成的地區。
由於生產能力的區別,第i個片區能夠花費a[i]元生產1個商品,但是最多生產b[i]個。
同樣的,由於每個片區的購買能力的區別,第i個片區也能夠以c[i]的****最多d[i]個物品。
由於這些因素,度度熊覺得只有合理的調動物品,才能獲得最大的利益。
據測算,每乙個商品運輸1公里,將會花費1元。
那麼喵哈哈村最多能夠實現多少盈利呢?
input
本題包含若干組測試資料。
每組測試資料報含:
第一行兩個整數n,m表示喵哈哈村由n個片區、m條街道。
接下來n行,每行四個整數a[i],b[i],c[i],d[i]表示的第i個地區,能夠以a[i]的**生產,最多生產b[i]個,以c[i]的****,最多**d[i]個。
接下來m行,每行三個整數,u[i],v[i],k[i],表示該條公路連線u[i],v[i]兩個片區,距離為k[i]
可能存在重邊,也可能存在自環。
滿足:
1<=n<=500,
1<=m<=1000,
1<=a[i],b[i],c[i],d[i],k[i]<=1000,
1<=u[i],v[i]<=n
一眼看上去就長的像個費用流。此題求得是最大費用,那麼我們將真正的費用取反去求最小,然後再取反就是最大費用了。建圖時,從源點向每個點連邊,費用為a[
i],流量為b[
i],從每個點向匯點連邊,費用為−c
[i] ,流量為d[
i],對於每條公路,在公路連線的兩個片區間連邊,費用為k[
i]。建完後跑乙個最小費用可行流即可,重邊和自環不會影響費用流的正確答案
#include
using
namespace
std;
typedef
long
long ll;
const
int n = 500 + 10, inf = 0x3f3f3f3f;
struct edge
g[n*n*10];
int cnt, head[n];
int dis[n], pre[n];
bool vis[n];
void add_edge(int v, int u, int cap, int cost)
void spfa(int s, int t)}}
}int cost_flow(int s, int t)
}int main()
for(int i = 1; i <= m; i++)
printf("%d\n", -cost_flow(ss, tt));
}return
0;}
hdu 6080 度度熊保護村莊
嘩啦啦村襲擊了喵哈哈村!度度熊為了拯救喵哈哈村,帶著自己的夥伴去救援喵哈哈村去了!度度熊與夥伴們很快的就過來佔據了喵哈哈村的各個軍事要地,牢牢的守住了喵哈哈村。但是度度熊發現,這是一場曠日持久的戰鬥,所以度度熊決定要以逸待勞,儲存盡量多的體力,去迎戰嘩啦啦村的戰士。於是度度熊決定派盡量多的人去休息,...
HDU 6375 度度熊學佇列
danshlem description 度度熊正在學習雙端佇列,他對其翻轉和合併產生了很大的興趣。初始時有 n 個空的雙端佇列 編號為 1 到 n 你要支援度度熊的 q 次操作。1 u w val 在編號為 u 的佇列裡加入乙個權值為 val 的元素。w 0 表示加在最前面,w 1 表示加在最後面...
hdu6376 度度熊剪紙條
度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...