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