最小割 狼和羊的故事

2021-08-20 21:52:11 字數 1445 閱讀 9544

「狼愛上羊啊愛的瘋狂,誰讓他們真愛了一場;狼愛上羊啊並不荒唐,他們說有愛就有方向......」

orez聽到這首歌,心想:狼和羊如此和諧,為什麼不嘗試羊狼合養呢?說幹就幹!

orez的羊狼圈可以看作乙個n*m個矩陣格仔,這個矩陣的邊緣已經裝上了籬笆。可是drake很快發現狼再怎麼也是狼,它們總是對羊垂涎三尺,那首歌只不過是乙個動人的傳說而已。所以orez決定在羊狼圈中再加入一些籬笆,還是要將羊狼分開來養。 通過仔細觀察,orez發現狼和羊都有屬於自己領地,若狼和羊們不能呆在自己的領地,那它們就會變得非常暴躁,不利於他們的成長。

orez想要新增籬笆的盡可能的短。當然這個籬笆首先得保證不能改變狼羊的所屬領地,再就是籬笆必須修築完整,也就是說必須修建在單位格仔的邊界上並且不能只修建一部分。

輸入輸出格式

輸入格式:

檔案的第一行包含兩個整數n和m。接下來n行每行m個整數,1表示該格仔屬於狼的領地,2表示屬於羊的領地,0表示該格仔不是任何乙隻動物的領地。

輸出格式:

檔案中僅包含乙個整數ans,代表籬笆的最短長度。

輸入輸出樣例

輸入樣例

2 2

2 2

1 1

輸出樣例

2 說明

資料範圍

10%的資料 n,m≤3

30%的資料 n,m≤20

100%的資料 n,m≤100

容易想到狼跑去吃羊的方案數,如果講方案數降至0則狼無法再吃羊

這不就是最小割嘛!

容易想到從格仔到格仔之間的方案數必定為1,則構圖如下:

源點連狼,流量∞

羊連匯點,流量∞

格仔與相鄰格仔連,流量1

跑最大流即可

根據最大流最小割定理,得出最小割=最大流

#include 

#include

#include

#define rep(i,a,b) for (i=a;i<=b;i++)

#define inf 2147483647

using

namespace

std;

struct edgeg[120011];

intlist[10011],d[10011],cur[10011];

int cnt=1;

int s,t;

int ans;

int n,m;

void add(int u,int v,int w)

bool bfs()

i=g[i].nx;}}

return0;}

int mcf(int x,int minf)

return fout;

}void dinic()

}int main()

dinic();

printf("%d",ans);

}

ZJOI 2009 狼和羊的故事(最小割)

zjoi 2009 狼和羊的故事 如果只有 1 1 和2 role presentation style position relative 2 2的話,那麼就將源點連羊,狼連匯點 容量 inf inf 狼羊之間連一條容量為 1 1 的邊。但是,有的領地既不是羊的,也不是狼的。你可能會想把 0 ro...

最小割 ZJOI2009 狼和羊的故事

在乙個n m n m 的矩陣上,有些點是狼或羊的領地,狼可以往四周範圍走,但籬笆會限制狼的行動,問最少要幾隻籬笆可以讓所有的羊免受侵害 狼可以向四周任意移動,那麼我們對每個格仔和其周圍的格仔連邊,容量為1,即我們只會切掉這些中間邊,而不能廢掉任意乙隻狼或羊,所以源點或者匯點與狼羊之間的容量為 這時跑...

ZJOI2009 狼和羊的故事 最小割

給定一張 n times m 的網格圖,每個格仔可以取值為 1,2,0 要求將一些邊線染黑,使得所有的 1,2 被割開。n,m le 100 最小割,每個點向四周的點連邊 1 s to 1,2 to t infty 對於 0 點,只需要將其作為中間點,而不需要考慮其歸屬。include using ...