传送门

费用流水题。


依然是照着题意模拟建边就行了。

为了练板子又重新写了一遍费用流。

代码:

#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 题」分配问题(费用流)的更多相关文章

  1. 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)

    传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1​和i2i_2i2​,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1​),(i2​, ...

  2. 2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)

    传送门 费用流入门题. 直接按照题意模拟. 把货物的数量当做容量建边. 然后跑一次最小费用流和最大费用流就行了. 代码: #include<bits/stdc++.h> #define N ...

  3. 【刷题】LOJ 6012 「网络流 24 题」分配问题

    题目描述 有 \(n\) 件工作要分配给 \(n\) 个人做.第 \(i\) 个人做第 \(j\) 件工作产生的效益为 \(c_{ij}\) ​​.试设计一个将 \(n\) 件工作分配给 \(n\) ...

  4. 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)

    传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...

  5. 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)

    传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...

  6. Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

    Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...

  7. 【LOJ】 #6012. 「网络流 24 题」分配问题

    题解 又写了一遍KM算法,这题刚好是把最大最小KM拼在一起写的,感觉比较有记录价值 感觉KM始终不熟啊QAQ 算法流程大抵如下,原理就是每次我们通过减少最少的匹配量达成最大匹配,所以获得的一定是最大价 ...

  8. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  9. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

随机推荐

  1. centos配置DNS和ip

    Centos6.5 永久修改DNS地址的方法 1.配置ip地址文件 /etc/sysconfig/network-scripts/ifcfg-eth0添加一行 DNS1=8.8.8.8    #手动添 ...

  2. leetcode210

    public class Solution { //test case [1,0] public int[] findOrder(int numCourses, int[][] prerequisit ...

  3. Egret 工具推荐

    Egret 工具推荐--打造最好的开发环境--IDE篇http://bbs.egret.com/forum.php?mod=viewthread&tid=13581&fromuid=1 ...

  4. python限制函数执行时间

    from:https://stackoverflow.com/questions/366682/how-to-limit-execution-time-of-a-function-call-in-py ...

  5. java并发--流量控制demo

    实现一个流控程序.控制客户端每秒调用某个远程服务不超过N次,客户端是会多线程并发调用,需要一个轻量简洁的实现,大家看看下面的一个实现,然后可以自己写一个实现. import java.util.Dat ...

  6. ADO接口简介

    源地址:http://blog.csdn.net/xiaobai1593/article/details/7449151 参考: 1. 百度文库:http://wenku.baidu.com/view ...

  7. Filter接口编写过滤器

      Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程.为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用过滤器对信息 ...

  8. MongoDB 数据查询

    数据查询 基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty(): ...

  9. ubuntu搭建ftp服务器

    (1).首先用命令检查是否安装了vsftpd vsftpd -version  如果未安装用一下命令安装 sudo apt-get install vsftpd 安装完成后,再次输入vsftpd -v ...

  10. 用R包来下载sra数据

    1)介绍 我们用SRAdb library来对SRA数据进行处理. SRAdb 可以更方便更快的接入  metadata associated with submission, 包括study, sa ...