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] ...
随机推荐
- [友盟微博分享]does not contain bitcode. You must rebuild it with
1.我的 Xcode 明明打开了 bitcode 了,为什么还会报错呢?挺奇怪的. 2.上网一查,才知道,友盟需要 bitcode,Xcode 不支持,只要关闭bitcode就可以 了. 3.其实我也 ...
- SDL2.0学习
http://www.ffmpeg.org/download.html http://doc.okbase.net/leixiaohua1020/archive/110977.html //视频 h ...
- Maven3路程(一)用Maven创建第一个web项目(2)
工具/原料 Windows 系统 JDK 1.5 及以上版本 Maven 3.0 及以上版本 方法/步骤 1 首先检查Eclipse是否已经添加的Maven插件,打开Eclipse, 依次选择 &qu ...
- 【LeetCode】16. 4Sum
题目:Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...
- jQuery获取Ajax函数的返回值
参考自: http://blog.csdn.net/crx05/article/details/7362252 function test() { var myText = ""; ...
- jquery 的datatables插件问题
翻页后js失效: 重绘事件-当表格重绘完成后 重新绑定事件: draw.dt $('#example').dataTable(); $('#example').on( 'draw.dt', fun ...
- Python 基础 - 对文本的处理
Python 对文本文件的处理. 对文本操作之前,必须要先open 这个文件,open完成之后需要close . # -*- coding: utf-8 -*- f=open('test.txt',' ...
- JSCH实现文件上传的代码实例
package com.vcredit.ddcash.monitor.sendmail; import java.io.File;import java.io.FileInputStream;impo ...
- Windows7无法访问(远程登录)Windows 2003共享问题解决
解决方法: 1.直接按下win+r键,输入gpedit.msc,打开本地组策略编辑器. 2.找到“计算机配置”-->“Windows设置”-->“安全设置”-->“本地策略”--&g ...
- 用session实现简单的购物
package cn.itcast.shopping; import java.io.IOException; import java.io.PrintWriter; import java.util ...