hdoj 3657 Game(網路流 最小割)

2021-10-04 19:45:18 字數 1973 閱讀 6609

題意:給定乙個矩陣,矩陣的每個方格有乙個權值,從中取出方格,使取出的值最大。但是有兩個約束: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...