顯然是最小割...
對於規律(i, j, k) i,j 互相連邊, 容量為k
對於規則(s, a, b) 新建乙個點x, x與s中每個點連一條弧, 容量+∞, 然後再根據a決定x與源點或匯點連邊.
跑最大流, 用總收益減去就是答案了...挺好想的一道題...
#includeusing namespace std;time limit: 10 sec memory limit: 256 mbconst 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;
}
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個單位的作物。...