題意:給定乙個矩陣,矩陣的每個方格有乙個權值,從中取出方格,使取出的值最大。但是有兩個約束:1、去相鄰方格要付出一些代價 2、有一些方格必須要選
解題思路:
取出的值最大也就是不取的值最小,問題實際是最小割問題。本題建圖方法與hdoj 1565 方格取數類似,根據行列相加的奇偶性將方格染色,黑點與源點s連線,白點與匯點t連線。(此題題解:hdoj 1565 方格取數(1)(最大流最小割))而本題新增的兩個約束,可以通過改變邊上的容量來實現。
1、方格取數(1)中的約束是相鄰方格不能取,因此相鄰方格之間連邊的容量是∞,代表不能割斷,使得想要源點s與匯點t不連通,一定要將」s——黑點」或」白點——t」的其中一條邊割斷;而本題只需付出一些代價就可以連線相鄰的方格,那麼就將上面的容量∞變為題中給出的代價,這樣既可以取到」s——黑點」,又可以取到」白點——t」,因為最後算最大值時採用 總值 - 最小割 的方式,所以這一部分會算在最小割中被減去。
2、有些方格必須選,說明這些方格不能被割去,那麼就將」s——黑點」或」白點——t」的容量設為∞,因為在計算」最小」割的時候,∞必然不會被選進。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define jojo cout<<"jojo"namespace std;
const
long
long inf =
~0ull
>>2;
const
int inf =
0x3f3f3f3f
;const
int maxn =
1e4+5;
const
int dirx=
, diry=
;int head[maxn]
, cur[maxn]
;int lev[maxn]
;int a[
110]
[110];
bool must[
110]
[110];
//must[i][j]==true代表(i, j)必須要選
int s =
0, t;
int t;
struct tagedgeedge[
2*maxn]
;bool
levelgraph()
}}if(lev[t]==-
1)return
false
;else
return
true;}
intfindpath
(int k,
int flow_in)
}return flow_out;
}int
dinic()
return res;
}void
addedge
(int u,
int v,
int w)
void
init()
intmain()
}while
(k--
)for
(int i =
1; i <= n; i++
)else
/*黑點與相鄰白點連邊*/
for(
int p =
0; p <
4; p++)}
else
else}}
}/*最大值 = 總值 - 最小割*/
printf
("%d\n"
, sum-
dinic()
);}return0;
}
網路流 最小割
標籤 網路流 最小割 原題 洛谷p2057 善意的投票 題目描述 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋...
網路流 最小割
割是一種對網路流點的劃分方式 對於乙個網路流圖g v,e 劃分為s和t兩部分,其中t v s,源點s s,匯點t t 淨流f s,t 表示穿過割 s,t 的流量之和 f s,t f u,v u s,v t 割的容量c s,t 為所有從s到t的邊容量之和 c s,t c u,v u s,v t f s...
網路流之最小費用流
這是一道模板題。給定乙個圖,每條邊有容量和費用,使用每條邊的單位流量需要支付特定的費用。給定源點 1和匯點 n,求圖的最大流和最大流需要支付的最小費用。第一行兩個整數n,m,表示有 n 個點 m 條邊。從第二行開始的之後 m 行,每行四個整數s i t i c i w i 表示一條從 s i 到 t...