BZOJ 4177 Mike的農場 最小割

2022-02-06 16:07:00 字數 1737 閱讀 1024

顯然是最小割...

對於規律(i, j, k) i,j 互相連邊, 容量為k

對於規則(s, a, b) 新建乙個點x, x與s中每個點連一條弧, 容量+∞, 然後再根據a決定x與源點或匯點連邊. 

跑最大流, 用總收益減去就是答案了...挺好想的一道題...

#includeusing namespace std;

const int maxn = 10100;

const int inf = 10000000;

struct edge e[1000000], *pt = e, *head[maxn];

inline void add(int u, int v, int w)

inline void addedge(int u, int v, int w)

int s, t, n, cnt[maxn], h[maxn];

edge *cur[maxn], *p[maxn];

int maxflow()

flow += a;

a = inf;

}} else

cnt[h[x]]++;

if(x != s) x = p[x]->rev->to;

} }return flow;

}

int main()

for(int i = 1; i <= n; i++)

while(m--)

for(int i = 1; i <= k; i++)

addedge(n + i, t, b);

} else

addedge(s, n + i, b);

} }printf("%d\n", ans - maxflow());

return 0;

}

time limit: 10 sec  memory limit: 256 mb

submit: 163  solved: 111

[submit][status][discuss]mike有乙個農場,這個農場n個牲畜圍欄,現在他想在每個牲畜圍欄中養乙隻動物,每只動物可以是牛或羊,並且每個牲畜圍欄中的飼養條件都不同,其中第i個牲畜圍欄中的動物長大後,每只牛可以賣a[i]元,每只羊可以賣b[i]元,為了防止牛羊之間相互影響,mike找到了m條規律,每條規律給出乙個三元組(i, j, k)表示如果第i個圍欄和第j個圍欄養的是不同的動物,那麼mike就需要花費k的代價請人幫忙處理牛羊之間的影響。不過同時mike也發現k條特殊的規則(s, a, b),表示如果s中所有牲畜圍欄中都養的是動物a,那麼mike可以獲得b的額外收入。現在mike想知道他該在哪些圍欄中飼養什麼動物才能使得總收益最大,為了簡化問題,你只需要輸出最大收益。

第一行三個整數n、m、k,表示一共有n個圍欄,m條規律,k條規則。

第二行有n個整數,表示a[i]。

第三行有n個整數,表示b[i]。

接下來m行,每行有三個整數(i, j, k)表示一條規則。

再接下來k行,每行一開始有三個整數t、a和b,表示一條規則(s, a, b),其中s的大小為t,接下來

t個整數表示s中的元素(a為0表示全為牛,a為1表示全為羊)。

輸出乙個整數ans,表示最大收益。

4 2 1

1 2 3 1

2 3 1 2

1 2 3

1 3 2

2 0 100 1 2

108對於100的資料,n <= 5000, m <= 5000, k <= 5000, a = 0 or 1。

4177 Mike的農場 最小割

最小割一直很弱啊.感覺是個很正常的題目怎麼就不會做呢qwq 首先對於每乙個點和s,t 連邊,代表選 0 或者 1,然後如果兩個同時選有損失就將兩個之間連邊 i j,k 因為如果i,j 選不同的這條邊就必須割掉,如果幾個同時選有收益就新建乙個點no w no w 和對應的源點或者匯點連邊為權值,和集合...

4177 Mike的農場 最小割

最小割模型,養牛養羊可以想到跑完網路流後這個點屬於s集或者t集。然後按照這個思路就很容易建圖。源點連圍欄,流量為養牛的收入,圍欄連匯點流量為養羊的收入,然後養不同動物會造成額外損失的兩個圍欄連雙向邊流量為 k 這樣可以保證假如兩個圍欄中養了不同的動物 跑完網路流分別屬於s集和 t 集 那麼這條邊肯定...

BZOJ3436 小K的農場

差分約束系統。分析一下三種情況 1.農場a aa比農場b bb至少多種植了c cc個單位的作物 即a b c b a ca geq b c b leq a c a b c b a c,a aa向b bb連一條長度為 c c c的單向邊。2.農場a aa比農場b bb至多多種植了c cc個單位的作物。...