ZJOI2009 狼和羊的故事 最小割

2022-06-06 15:39:08 字數 1006 閱讀 4996

給定一張 \(n \times m\) 的網格圖,每個格仔可以取值為 \(1,2,0\)。要求將一些邊線染黑,使得所有的 \(1,2\) 被割開。\(n,m \le 100\)

最小割,每個點向四周的點連邊(1),\(s \to 1, 2 \to t (\infty)\),對於 \(0\) 點,只需要將其作為中間點,而不需要考慮其歸屬。

#include using namespace std;

const int n = 55555, maxn = 262144;

#define reset(x) memset(x, 0, sizeof x)

struct graph

edge[maxn];

void init(int n0, int m0, int s0, int t0)

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

, head[u] = m;

}void make(int u, int v, int w)

int dfs(int u, int mx)

void solve()

} g;

const int di[4] = ;

const int dj[4] = ;

signed main()

; functionid_source = [&]() -> int ;

functionid_target = [&]() -> int ;

functionid_grid = [&](int i, int j) -> int ;

g.init(4*n*m, 0, id_source(), id_target());

for (int i = 1; i <= n; i++)

else if (t == 2)

for (int k = 0; k < 4; k++)}}

}g.solve();

cout << g.ans << endl;

}

ZJOI2009 狼和羊的故事

點此看題 考查網路流的建圖,要把羊和狼分割開來,很容易想到最小割問題,下面講一下建圖的方法 然後我們的圖就建出來了,這時候跑最大流就是答案。include include include include define inf 0x3f3f3f3f const int maxn 10005 using...

ZJOI2009 狼和羊的故事

solution 考慮 1 和 2 相鄰是必須要長度為 1 的籬笆,所以只需考慮 1,2 和 0 之間要不要放籬笆,用 s 連向所有的 1 所有的 2 連向 t 現在問題是要使 s 與 t 不連通,這不是經典的最小割問題嗎?code include include includeusing name...

題解 ZJOI2009 狼和羊的故事

題目戳我 text 顯然思路,把所有羊看成乙個源點,所有狼看成乙個匯點,格仔之間連容量為 1 的邊,直接跑最小割。技巧 這題收穫 注意到無限邊在最小割中特殊的意義。includeusing namespace std define int long long const int maxn 5e5 1...