BZOJ 1458 士兵占領

2021-07-02 15:53:27 字數 1541 閱讀 3100

time limit: 10 sec memory limit: 64 mb

submit: 632 solved: 366

[submit][status][discuss]

description

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

input

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

output

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

sample input

4 4 4

1 1 1 1

0 1 0 3

1 42 2

3 34 3

sample output

資料範圍

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

有源匯有上下界的最小流。

詳見《有上下界的網路流問題》

#include 

#include

#include

#include

#include

#include

#define m 500005

#include

#define inf 0x3f3f3f3f

using

namespace

std;

struct edge

e[m];

int tot,h[m],d[m],s,t,cur[m],cant[105][105],v[m],n,m;

void addedge(int from,int to,int cap)

; h[from]=tot;

e[++tot]=(edge);

h[to]=tot;

}int bfs()}}

return v[t];

}int dfs(int x,int a)

}return flow;

}int dinic()

return flow;

}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 (!cant[i][j])

addedge(i,n+j,1);

int flow=dinic();

if (flow==jud)

else

puts("jiong!");

return

0;}

bzoj 1458 士兵占領

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

bzoj1458 士兵占領

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

BZOJ1458 士兵占領

給定乙個 n times m 的方格,其中有一些障礙格仔,限定每行每列分別至少要有的士兵數,問最少要擺多少個士兵。最大流考慮在非障礙格仔都擺上乙個士兵,假如還是不夠數,那麼無解 否則考慮哪些士兵可以去掉仍然滿足限制條件。所以源點連 該行可以擺放的數量 限定最小值 的邊權到行的每個節點,同理,列的每個...