bzoj1458 士兵占領 網路流

2021-07-11 07:14:40 字數 1338 閱讀 4710

有乙個m * n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個士兵, 第j列至少放置了cj個士兵。現在你的任務是要求使用最少個數的士兵來占領整個棋盤。

第一行兩個數m, n, k分別表示棋盤的行數,列數以及障礙的個數。 第二行有m個數表示li。 第三行有n個數表示ci。 接下來有k行,每行兩個數x, y表示(x, y)這個格仔是障礙。

輸出乙個數表示最少需要使用的士兵個數。如果無論放置多少個士兵都沒有辦法占領整個棋盤,輸出」jiong!」 (不含引號)

4 4 4

1 1 1 1

0 1 0 3

1 42 2

3 34 3

4資料範圍

m, n <= 100, 0 <= k <= m * n

題解:源點向每一行連容量為該行所需士兵數量的邊.

每一列向匯點連容量為該列所需士兵數量的邊.

對於每個可以擺放的點(x,y).

x向y連容量為1的邊.

sigma(l[i])+sigma(c[i])-最小割即可.

**:

#include#include#include#define n 300

#define m 20000

#define inf 2100000000

using namespace std;

int n,m,x,y,k,sum1,sum2,t,next[m<<1],point[n],h[n],l[n];

int dis[n],pre[n],gap[n],cur[n],cnt=1,map[n][n],num1[n],num2[n];

bool f;

struct usee[m<<1];

void add(int x,int y,int v)

int isap()

if (f)

}else

} return ans;

}int main()

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

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

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

for (int j=1;j<=m;j++)

if (!map[i][j])

add(i+1,j+n+1,1),num1[i]++,num2[j]++;

for (int i=1;i<=n;i++)if (num1[i]for (int i=1;i<=m;i++)if (num2[i]int t=sum1+sum2-isap();

cout<}

bzoj 1458 士兵占領 網路流

description 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個士兵,第j列至少放置了cj個士兵。現在你的任務是要求使用最少個數的士兵來占領整個棋盤。inpu...

BZOJ 1458 士兵占領(網路流)

description 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個士兵,第j列至少放置了cj個士兵。現在你的任務是要求使用最少個數的士兵來占領整個棋盤。solu...

BZOJ 1458 士兵占領

time limit 10 sec memory limit 64 mb submit 632 solved 366 submit status discuss description 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不...