最小割 ZJOI2009 狼和羊的故事

2021-08-21 06:03:50 字數 1285 閱讀 9810

在乙個n×

m n×m

的矩陣上,有些點是狼或羊的領地,狼可以往四周範圍走,但籬笆會限制狼的行動,問最少要幾隻籬笆可以讓所有的羊免受侵害

狼可以向四周任意移動,那麼我們對每個格仔和其周圍的格仔連邊,容量為1,即我們只會切掉這些中間邊,而不能廢掉任意乙隻狼或羊,所以源點或者匯點與狼羊之間的容量為∞,這時跑最大流即可

有人說,既然狼可以任意移動,那麼除非羊周圍都有籬笆,否則狼都可以到達羊**,那直接輸出羊的個數乘4不就好了嗎?

這種想法目光十分短淺,我們可以簡單舉乙個例子

首先有四隻羊

羊 羊

羊 羊

那麼如果按照貪心的想法,是這樣的

——————

|羊|羊|

——————

|羊|羊|

——————

這樣子的話一共需要4

× ×

4=16個籬笆,但是如果這樣擺放的話

——————

|羊 羊|

|羊 羊|

——————

則只需要8個籬笆,所以貪心演算法不成立,pa

ssp as

s!

#include

#include

#include

#define m 160001

#define id(i,j) (~-i)*m+j

using

namespace

std;int n,m,tot,l[m],d[m],s,t,ans;

const

short dx[4]=;

const

short dy[4]=;

struct nodee[m<<1];

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

;l[u]=tot++;

e[tot]=(node);l[v]=tot++;

return;

}bool bfs()}}

return

false;

}int dfs(int x,int flow)

e[i].w-=f;rest+=f;e[i^1].w+=f;

if(rest==flow) return flow;

}return rest;

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

ZJOI2009 狼與羊的故事 最小割

給定乙個 n times m 方格矩陣,每個格仔可在 0,1,2 中取值。要求在方格的邊上進行劃分,使得任意聯通塊內不同時包含 1 和 2 的格仔。若對方格矩陣的形式感到困惑,我們可以先考慮圖上的形式。假設圖中有節點 w 1 q 1 s 1 s 2 且 w 1 與其它三者間各有一邊,此外 q 1 和...