bzoj 1458 士兵占領 網路流

2021-07-24 05:00:56 字數 1635 閱讀 2081

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

腦洞還是蠻大的。

要把問題轉換成先把所有格仔都填滿,然後再求最多能刪掉多少個士兵。

用num1[i]表示第i行可以放多少個士兵,num2[i]表示第i列能放多少個士兵。

那麼s向每行連流量為num1[i]-l[i]的邊,每列向t連流量為num2[i]-c[i]的邊,若第i行第j列不是障礙物則在第i行第j列連流量為1的邊,跑一邊最大流,然後ans=n*m-k-maxflow

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define n 305

using

namespace

std;

int n,m,k,ans,numl[n],numc[n],l[n],c[n],dis[n],map[105][105],cnt,last[n],s,t,cur[n];

struct edgee[n*1000];

queue

q;void addedge(int u,int v,int c)

bool bfs()

}return0;}

int dfs(int x,int maxf)

return ret;

}void dinic()

}int main()

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

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

s=0;t=n+m+1;

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

addedge(s,i,numl[i]-l[i]);

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

addedge(n+i,t,numc[i]-c[i]);

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

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

if (!map[i][j]) addedge(i,j+n,1);

dinic();

printf("%d",n*m-k-ans);

return

0;}

bzoj1458 士兵占領 網路流

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

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