bzoj1458 士兵占領(最大流)

2022-02-28 03:27:57 字數 1928 閱讀 1285

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

輸入格式:

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

輸出格式:

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

輸入樣例#1: 複製

4 4 4

1 1 1 1

0 1 0 3

1 42 2

3 34 3

輸出樣例#1: 複製

4

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

題解

據說正解是上下界網路流?還可以跑費用流?然而最大流也可以?

這裡用的是最大流的做法

我們可以先在所有能擺的地方都擺上棋子,然後看一看最多能拿走多少棋子

給每行每列分別建乙個點,如果$(x,y)$不是障礙格,就把$x$對應的點向$y$對應的點連邊,容量為$1$表示這個點可以被刪一次

然後從源點向所有行連邊,容量為這一行最多能刪的士兵數(總共格仔數-障礙格仔數-必須格仔數)

從所有列向匯點連邊,容量為這一列最多能刪的士兵數(同上)

這樣,可以發現不管怎麼刪都不會超出限制條件。那麼要刪掉最多士兵,只要跑乙個最大流就可以了

1

//minamoto

2 #include3 #include4 #include5 #include6

#define inf 0x3f3f3f3f

7using

namespace

std;

8#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?eof:*p1++)

9char buf[1

<<21],*p1=buf,*p2=buf;

10 inline int

read()

20const

int n=205,m=50005;21

int head[n],next[m],ver[m],edge[m],tot=1;22

intdep[n],cur[n],l[n],c[n],ll[n],cc[n],vis[n][n],n,m,k,s,t,ans;

23 queueq;

24 inline void add(int u,int v,int

e)28

bool

bfs()41}

42}43return

false;44

}45int dfs(int u,int

limit)55}

56if(!flow) dep[u]=-1;57

return

flow;58}

59int

dinic()

64int

main()

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

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

76if(!vis[i][j]) add(i,j+n,1

);77

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

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

87 ans-=dinic();

88 printf("

%d\n

",ans);

89return0;

90 }

BZOJ1458 士兵占領(最大流)

傳送門 判斷joing 的條件是顯然的 如果行或列的總點數減去障礙數還不夠li或ci的話,肯定無解。我的建圖比較奇怪。三排點,分別為每一行,每個點,每一列。s 每一行,li 每一列 t,ci 每一行 當前行中的點,1 每個點 所在的列,1 注意這裡的點必須不是障礙點。最大流即為答案。貼上hzwer的...

BZOJ1458 士兵占領 最大流

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

bzoj1458 士兵占領 最大流

又是反過來考慮。直接計算會很複雜 畢竟每一行和每一列都會有一定的限制條件,很難同時滿足 那麼我們放過來思考,先把所有的各自都放上士兵一共n m k個,然後考慮拿走一部分士兵。源點向每行建邊,邊權是 m l i 這一行的障礙格仔數目,即是能夠拿走的士兵數目,然後列向匯點建邊,同理,每乙個格仔 可拿走 ...