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

2021-08-20 22:26:37 字數 1624 閱讀 8558

【zjoi 2009】狼和羊的故事

如果只有

1 1

和2' role="presentation" style="position: relative;">2

2的話,那麼就將源點連羊,狼連匯點(容量

inf inf

),狼羊之間連一條容量為

1 1

的邊。但是,有的領地既不是羊的,也不是狼的。

你可能會想把

0' role="presentation" style="position: relative;">00歸為

1 1

(或2' role="presentation" style="position: relative;">2

2),但是仔細想想可以發現還有更優的解。

最終的解決方案:

0 0

點與四周的所有節點連一條邊,這樣就可以在

0' role="presentation" style="position: relative;">0

0的四周自由切割,沒有附加限制。

#include 

#include

#include

using

namespace

std;

const

int maxl = 105;

const

int maxn = 10005;

const

int maxm = 60005;

const

int inf = 1000000000;

int n, m, src, snk, c[maxl][maxl], dis[maxn];

int tot, ter[maxm], len[maxm], nxt[maxm], lnk[maxn];

int id(int i, int j)

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

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

int min(int x, int y)

bool bfs(int s, int t) }}

return ~dis[t];

}int find(int u, int lft)

int tmp, res = 0;

for (int v, w, i = lnk[u]; ~i && res < lft; i = nxt[i]) }}

if (res < lft)

return res;

}int dinic()

}return res;

}int main()

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

if (c[i][j] == 2) }}

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

adde(id(i, j), id(i + 1, j), 1);}}

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

adde(id(i, j), id(i, j + 1), 1);}}

printf("%d\n", dinic());

return

0;}

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...