time limit: 10 sec memory limit: 64 mb
submit: 685 solved: 398
[submit][status][id=1458" style="color: rgba(0, 0, 255, 1); text-decoration: none" rel="noopener">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
bzoj1458 士兵佔據
time limit 10 sec memory limit 64 mb submit 685 solved 398 submit status discuss 有乙個m n的棋盤,有的格仔是障礙。如今你要選擇一些格仔來放置一些士兵,乙個格仔裡最多能夠放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...
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的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...