bzoj1458 士兵占領

2021-12-29 22:18:11 字數 1852 閱讀 3041

time limit: 10 sec memory limit: 64 mb

submit: 685 solved: 398

[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

有源匯有上下界最小流問題

將行抽象為左部點,列抽象為右部點。

如果某個位置沒有障礙,就從行對應的節點到列對應的節點連邊,下界為0,上界為1。在從源點向每行對應的節點連邊,從每列對應的節點向匯點連邊,下界均為該行或列的最少士兵數,上界均為正無窮。

最後求s到t的最小流。

#include

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define pa pair

#define maxn 300

#define maxm 100000

#define inf 1000000000

using namespace std;

int head[maxn],cur[maxn],dis[maxn],in[maxn];

int cnt=1,mx=0,maxflow,n,m,k,x,y,s,t,ss,tt;

bool a[105][105];

struct edge_type

e[maxm];

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

} inline void add_edge(int x,int y,int v)

;head[x]=cnt;

e[++cnt]=(edge_type);head[y]=cnt;

} inline void insert(int x,int y,int l,int r)

inline void build()

} inline bool bfs()

} return false;

} inline int dfs(int x,int f)

} if (!sum) dis[x]=-1;

return sum;

} inline void dinic()

} inline void minflow()

{ s=ss;t=tt;

dinic();

int ans=e[cnt].v;

if (ans

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 士兵占領

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