2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)
传送门
费用流水题。
依然是照着题意模拟建边就行了。
为了练板子又重新写了一遍费用流。
代码:
#include<bits/stdc++.h>
#define N 305
#define M 90005
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n;
struct edge{int v,next,c,w;};
struct MCMF{
int first[N],d[N],pred[N],pos[N],flow[N],s,t,cnt;
edge e[M];
bool in[N];
inline void init(){memset(first,-1,sizeof(first)),cnt=-1,s=0,t=n*2+1;}
inline void addedge(int u,int v,int c,int w){e[++cnt].v=v,e[cnt].c=c,e[cnt].w=w,e[cnt].next=first[u],first[u]=cnt;}
inline void add(int u,int v,int c,int w){addedge(u,v,c,w),addedge(v,u,0,-w);}
inline bool spfa1(){
queue<int>q;
for(int i=1;i<=t;++i)d[i]=0x3f3f3f3f;
d[s]=0,pred[t]=-1,flow[s]=0x3f3f3f3f,in[s]=1,q.push(s);
while(!q.empty()){
int x=q.front();
q.pop(),in[x]=false;
for(int i=first[x];~i;i=e[i].next){
int v=e[i].v;
if(e[i].c&&d[v]>d[x]+e[i].w){
d[v]=d[x]+e[i].w,flow[v]=min(flow[x],e[i].c),pred[v]=x,pos[v]=i;
if(!in[v])in[v]=1,q.push(v);
}
}
}
return d[t]!=0x3f3f3f3f;
}
inline int solve1(){
int ret=0;
for(int w=t;spfa1();w=t){
ret+=d[t];
while(w!=s)e[pos[w]].c-=flow[t],e[pos[w]^1].c+=flow[t],w=pred[w];
}
return ret;
}
inline bool spfa2(){
queue<int>q;
for(int i=1;i<=t;++i)d[i]=-0x3f3f3f3f;
d[s]=0,pred[t]=-1,flow[s]=0x3f3f3f3f,in[s]=1,q.push(s);
while(!q.empty()){
int x=q.front();
q.pop(),in[x]=false;
for(int i=first[x];~i;i=e[i].next){
int v=e[i].v;
if(e[i].c&&d[v]<d[x]+e[i].w){
d[v]=d[x]+e[i].w,flow[v]=min(flow[x],e[i].c),pred[v]=x,pos[v]=i;
if(!in[v])in[v]=1,q.push(v);
}
}
}
return d[t]!=-0x3f3f3f3f;
}
inline int solve2(){
int ret=0;
for(int w=t;spfa2();w=t){
ret+=d[t];
while(w!=s)e[pos[w]].c-=flow[t],e[pos[w]^1].c+=flow[t],w=pred[w];
}
return ret;
}
}mcmf1,mcmf2;
int main(){
n=read(),mcmf1.init(),mcmf2.init();
for(int i=1;i<=n;++i)mcmf1.add(mcmf1.s,i,1,0),mcmf1.add(i+n,mcmf1.t,1,0),mcmf2.add(mcmf2.s,i,1,0),mcmf2.add(i+n,mcmf2.t,1,0);
for(int val,i=1;i<=n;++i)for(int j=1;j<=n;++j)val=read(),mcmf1.add(i,j+n,1,val),mcmf2.add(i,j+n,1,val);
cout<<mcmf1.solve1()<<'\n'<<mcmf2.solve2();
return 0;
}
2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)的更多相关文章
- 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)
传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1和i2i_2i2,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1),(i2, ...
- 2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)
传送门 费用流入门题. 直接按照题意模拟. 把货物的数量当做容量建边. 然后跑一次最小费用流和最大费用流就行了. 代码: #include<bits/stdc++.h> #define N ...
- 【刷题】LOJ 6012 「网络流 24 题」分配问题
题目描述 有 \(n\) 件工作要分配给 \(n\) 个人做.第 \(i\) 个人做第 \(j\) 件工作产生的效益为 \(c_{ij}\) .试设计一个将 \(n\) 件工作分配给 \(n\) ...
- 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)
传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...
- 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)
传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...
- Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...
- 【LOJ】 #6012. 「网络流 24 题」分配问题
题解 又写了一遍KM算法,这题刚好是把最大最小KM拼在一起写的,感觉比较有记录价值 感觉KM始终不熟啊QAQ 算法流程大抵如下,原理就是每次我们通过减少最少的匹配量达成最大匹配,所以获得的一定是最大价 ...
- 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题
题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...
- [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
随机推荐
- Spring事务控制和传递性理解
1.在同一类方法间相互调用,如果调用方无事务控制,被调用方有事务控制,则被调用方也无事务 原因:外部经过spring容器调用service的方法事务才生效,service类内部方法间相互调用事务不生效 ...
- Spring MVC 基本储备
@RequestMapping value, method, params 必须存在参数, headers: 请求头部必须是啥样 @PathVariable 绑定URL参数 HiddenHttpMet ...
- sts,eclipse里面配置tomcat
第一步:点击window-->preferences-->server-->Runtime Environments点击add. 第二步:选择本机上面有的tomcat版本点击next ...
- visual c++ 中的stdafx.h头文件的作用
stdafx.h VC工程里面经常见到stdafx.h这个头文件,以前也没有特别注意,但是这个文件用不好经常会出错,所以就GOOGLE了一下,总算是弄清楚了... stdafx的英文全称为:Stand ...
- JSP复习(part 3 )
3.4.4 request对象提供了一些用来获取客户信息的方法,利用这些方法,可以获取客户端的IP地址 协议等有关信息 3.5 request对象和response对象相对应,用于响应客户请求,由服务 ...
- Dotfuscator Professional Edition获取代码发布和混淆代码
1 Dotfuscator Professional Edition 4.9 破解版 下载地址:http://www.pc0359.cn/downinfo/39815.html 备份地址:C:\D\9 ...
- Python模拟登录的几种方法
目录 方法一:直接使用已知的cookie访问 方法二:模拟登录后再携带得到的cookie访问 方法三:模拟登录后用session保持登录状态 方法四:使用无头浏览器访问 正文 方法一:直接使用已知的c ...
- hadoop 链接 mysql
数据在hadoop服务器上,需要导入mysql 可以直接在hadoop上操作 要知道 mysql的 账号 密码 host 步骤: 进入shell 输入: mysql -u 'name' -p'pas ...
- js json转对象
使用eval() 读取 for (var i=0;i< response.length; i++) { //alert(response[i].username) html=html+" ...
- JAVA list集合两种去重方法
结果: 转载地址:http://geek.csdn.net/news/detail/127940