最小割模型,養牛養羊可以想到跑完網路流後這個點屬於s集或者t集。
然後按照這個思路就很容易建圖。源點連圍欄,流量為養牛的收入,圍欄連匯點流量為養羊的收入,然後養不同動物會造成額外損失的兩個圍欄連雙向邊流量為
k ,這樣可以保證假如兩個圍欄中養了不同的動物(跑完網路流分別屬於s集和
t 集)那麼這條邊肯定被割斷。
然後處理那k條規則,每個規則都新建乙個點,如果a=
0,則源點連新建的點流量為
b ,新建的點連所有有要求的圍欄,流量為無窮。a=
1時也同樣處理,在匯點一邊新建點連邊也類似。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define n 500005
#define mx 1e9
using namespace std;
int sc()
while(ch>='0'&&ch<='9')
return
x*f;
}int
q[n],dis[n];
int head[n],nxt[n],lst[n],c[n];
int n,m,k,s,t,sum,tot=1;
void insert(int
x,int
y,int a,int b)
bool bfs()
return dis[t];
}int dfs(int
x,int f)
if(!ww)dis[x]=0;
return ww;
}int main()
for(int i=1;i<=k;i++)
else
}while(bfs())sum-=dfs(s,mx);
cout0;}
4177 Mike的農場 最小割
最小割一直很弱啊.感覺是個很正常的題目怎麼就不會做呢qwq 首先對於每乙個點和s,t 連邊,代表選 0 或者 1,然後如果兩個同時選有損失就將兩個之間連邊 i j,k 因為如果i,j 選不同的這條邊就必須割掉,如果幾個同時選有收益就新建乙個點no w no w 和對應的源點或者匯點連邊為權值,和集合...
BZOJ 4177 Mike的農場 最小割
顯然是最小割.對於規律 i,j,k i,j 互相連邊,容量為k 對於規則 s,a,b 新建乙個點x,x與s中每個點連一條弧,容量 然後再根據a決定x與源點或匯點連邊.跑最大流,用總收益減去就是答案了.挺好想的一道題.includeusing namespace std const int maxn ...
最大流最小割定理與最小割的數學模型
一.最大流最小割定理.割 對於一張網路,我們稱乙個邊集的子集為乙個割,當且僅當去掉這個邊集的子集後源點s ss無法到達匯點ttt.最小割 邊權和最小的割被稱為最小割.最大流 最小割定理 一張網路的最大流等於其最小割的邊權之和.這個東西太經典了這裡就不證了.二.輸出一種最小割的方案.先跑一遍最大流得到...