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