方格取数问题(二分图+建模技巧)
将原图黑白染色,并保证产生矛盾的两个位置颜色不同。源点连接黑点,白点连接汇点,黑点连接与之产生矛盾的白点。通过 最大和=全局和-最小割,在建立的网络上跑最小割(最大流)即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21for(register int i=1;i<=M;++i){
for(register int j=1;j<=N;++j){
int w;
scanf("%d",&w);
sum+=w;
if((i+j)&1){
AddEdge(S,(i-1)*N+j,w);
AddEdge((i-1)*N+j,S,INF);
for(register int k=0;k<=3;++k){
int tx=i+nx[k],ty=j+ny[k];
if(tx<1||tx>M||ty<1||ty>N) continue;
AddEdge((i-1)*N+j,(tx-1)*N+ty,INF);
AddEdge((tx-1)*N+ty,(i-1)*N+j,0);
}
}
else{
AddEdge((i-1)*N+j,T,w);
AddEdge(T,(i-1)*N+j,INF);
}
}
}