bzoj1458 士兵占领
费用流,连下面几类边
1.s->s',流量为n*m,费用为0,表示最多可放置n*m个士兵
2.s'->行
(1)流量为a[i],费用为-n*m,表示必须在这一行放置a[i]个士兵。
(2)流量为n*m,费用为0,表示该行可以放置其他任意数目士兵。
3.行->列,流量为1,费用为1,表示第i行第j列放置的士兵数目
4.列->t
(1)流量为b[i],费用为-n*m,表示必须在这一列放置b[i]个士兵。
(2)流量为n*m,费用为0,表示该列可以放置其他任意数目士兵。
5.s'->t,流量为n*m,费用为0,表示一些士兵可以不用放置。
最后答案为费用+(Σa[i]+Σb[i])*n*m
代码
- #include<cstdio>
- #include<algorithm>
- #include<queue>
- #define mp make_pair
- #define pii pair<int,int>
- #define N 10010
- #define M 200010
- #define inf 0x37373737
- using namespace std;
- struct MCMF{
- int h[N] , dis[N] , ing[N] , pre[N] , s , t , n;
- int to[M] , ne[M] , cap[M] , cost[M] , e;
- void ini(){
- fill(h,h+N,-);
- e = ;
- }
- void liu(int u,int v,int c,int w){
- to[e] = v , ne[e] = h[u] , cap[e] = c , cost[e] = w;
- h[u] = e++;
- }
- void link(int u,int v,int c,int w){
- liu(u,v,c,w);
- liu(v,u,,-w);
- }
- bool spfa(){
- queue<int> Q;
- fill(ing,ing+n,);
- fill(pre,pre+n,-);
- fill(dis,dis+n,inf);
- ing[s] = true , dis[s] = ;
- Q.push(s);
- while(!Q.empty()){
- int c = Q.front();Q.pop();ing[c] = false;
- for(int k=h[c];~k;k=ne[k]){
- int v = to[k];
- if(cap[k] <= ) continue;
- if(dis[c] + cost[k] < dis[v]){
- dis[v] = dis[c] + cost[k];
- pre[v] = k;
- if(!ing[v]) Q.push(v) , ing[v] = true;
- }
- }
- }
- return dis[t] != inf;
- }
- int flow , mincost;
- pii run(int _s,int _t,int _n){
- s = _s , t = _t , n = _n;
- flow = mincost = ;
- while(spfa()){
- int pl = inf , p , k;
- for(p=t;p!=s;p=to[k^]){
- k = pre[p];
- pl = min(pl,cap[k]);
- }
- for(p=t;p!=s;p=to[k^]){
- k = pre[p];
- cap[k] -= pl;
- cap[k^] += pl;
- }
- mincost += pl * dis[t];
- flow += pl;
- }
- return mp(flow,mincost);
- }
- };
- MCMF t;
- int n,m,k,i,j,a[N],b[N],sum;
- int flag[][];
- int main()
- {
- scanf("%d%d%d",&n,&m,&k);
- for (i=;i<=n;i++)
- scanf("%d",&a[i]),sum+=a[i];
- for (i=;i<=m;i++)
- scanf("%d",&b[i]),sum+=b[i];
- for (i=;i<=k;i++)
- {
- int A,B;
- scanf("%d%d",&A,&B);
- flag[A][B]=;
- }
- t.ini();
- t.link(,n+m+,n*m,);
- t.link(n+m+,n+m+,n*m,);
- for (i=;i<=n;i++)
- {
- t.link(n+m+,i,a[i],-n*m);
- t.link(n+m+,i,n*m,);
- }
- for (i=;i<=m;i++)
- {
- t.link(n+i,n+m+,b[i],-n*m);
- t.link(n+i,n+m+,n*m,);
- }
- for (i=;i<=n;i++)
- for (j=;j<=m;j++)
- if (flag[i][j]==)
- t.link(i,n+j,,);
- int ans=t.run(,n+m+,n+m+).second;
- printf("%d\n",ans+sum*n*m);
- }
bzoj1458 士兵占领的更多相关文章
- BZOJ1458 士兵占领 网络流 最大流 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8384699.html 题目传送门 - BZOJ1458 题意概括 有一个M * N的棋盘,有的格子是障碍.现在你 ...
- BZOJ1458:士兵占领(有上下界最小流)
Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...
- bzoj1458: 士兵占领(最大流)
题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...
- BZOJ1458 士兵占领 【带上下界网络流】
题目链接 BZOJ1458 题解 对行列分别建边,拆点,设置流量下限 然后\(S\)向行连边\(inf\),列向\(T\)连边\(inf\),行列之间如果没有障碍,就连边\(1\) 然后跑最小可行流即 ...
- bzoj1458: 士兵占领 网络流
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1458 也可以去luogu 思路 想成倒着删去点,使得依旧满足覆盖!! 左边横,右边列,之间用 ...
- bzoj1458士兵占领
传送门 和上一题差不多,每行和每列分别看做一个点,障碍点坐标的行和列就不建边,再按照有源汇上下界建图就好了,唯一的区别就是这个题求的是最小流 这个题的数据好水呢,建错图也能A呢 #include< ...
- 【BZOJ1458】士兵占领 最小流
[BZOJ1458]士兵占领 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占 ...
- 【BZOJ1458】【洛谷4311】士兵占领(网络流)
[BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...
- 【BZOJ-1458】士兵占领 最大流
1458: 士兵占领 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 782 Solved: 456[Submit][Status][Discuss] ...
随机推荐
- ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信
1.本文包括 1)在windows下使用ZMQ 2)在windows环境下与Linux环境下进行网络通信 2.在Linux下使用ZMQ 之前写过一篇如何在Linux环境下使用ZMQ的文章 <Ze ...
- linux下定时重启tomcat
工具/原料 linux tomcat 方法/步骤 编写tomcat_shutdown.sh: #!/bin/sh export JAVA_HOME=/home/oracle/jdk1..0_67/ e ...
- Repaint轨迹保留?(待处理,待编辑)
import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPane ...
- [CareerCup] 17.4 Maximum of Two Numbers 两数中的较大值
17.4 Write a method which finds the maximum of two numbers. You should not use if-else or any other ...
- asp.net 中 UEditor 图片和附件上传失败的处理方法
1.0 找到 net 文件夹下面的 web.config 配置文件,注释掉如下的两句: 2.0 Uploader文件默认属性为编译,将其属性改为内容以后重新运行程序,图片上传成功. 3.0 删除 im ...
- 导入excle数据将excle数据插入到数据库
实现功能是,用户可以直接导入对应数据,或者用户下载模板,填写数据,导入模板数据.easyui实现 前台页面 { text : '日清导入', iconCls : 'icon-print', handl ...
- 使用Sublime Text 直接运行Quick-cocos2d-x 项目
一.新建一个编译系统 { "cmd": "D:/WorkSoftWare/Quick/quick-cocos2d-x-3.3rc0/quick/samples/Runni ...
- select的5中子句where,group by, havaing, order by, limit的使用顺序及实例
-- 语法: SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ...
- 2145334赵文豪《Java程序设计》第2周学习总结
2145334赵文豪<Java程序设计>第2周学习总结 教材学习内容总结 第二周的学习结束了,又是充实的一周,在这周的java学习过程中,我们主要学习了java的基础语法.其中包括类型变量 ...
- poj1061-青蛙的约会(扩展欧几里德算法)
一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...