bzoj1458 士兵占領

2022-06-02 06:48:09 字數 1461 閱讀 4919

time limit: 10 sec  memory limit: 64 mb

submit: 920  solved: 518

[submit][status][discuss]

有乙個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

題解by黃學長:

此題的思路是先放滿棋盤,然後考慮最多可以刪多少個。。。

某一行和某一列的可以放的格仔數小於需求就直接jiong掉

然後從源向每一行連邊,流量為可以放的格仔數 - 需求的格仔數(也就是可以刪多少格仔)

從每一列向匯,同上.

從每乙個非障礙的格仔的行向列連邊流量為1

跑一遍最大流即可ans=可放格仔數-maxflow

1 #include2

#define rep(i,l,r) for(int i=l;i<=r;++i)

3const

int n=102333,inf=2147483647;4

using

namespace

std;

5int head[n],dis[n],tot=1

,n,m,k,ans,x,y,l[n],l1[n],p[n],p1[n],t;

6bool mp[123][123];7

struct

zse[n];

10 inline bool

bfs()18}

19if(dis[t]>0) return

1;else

return0;

20}21int find(int x,int

low)

30 dis[x]=-1;31

return low-delta;32}

33 inline void ins(int u,int v,int

w)36 inline void insert(int u,int v,int

w)39

intmain()

51 printf("

%d\n

",ans);

52 }

view code

BZOJ 1458 士兵占領

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

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的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...