• 【刷题】LOJ 6011 「网络流 24 题」运输问题


    题目描述

    W 公司有 (m) 个仓库和 (n) 个零售商店。第 (i) 个仓库有 (a_i) 个单位的货物;第 (j) 个零售商店需要 (b_j) 个单位的货物。货物供需平衡,即 (sumlimits_{i = 1} ^ m a_i = sumlimits_{j = 1} ^ n b_j) ​。从第 (i) 个仓库运送每单位货物到第 (j) 个零售商店的费用为 (c_{ij}) 。试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。

    输入格式

    (1) 行有 (2) 个正整数 (m)(n) ,分别表示仓库数和零售商店数。接下来的一行中有 (m) 个正整数 (a_i) ,表示第 (i) 个仓库有 (a_i) 个单位的货物。再接下来的一行中有 (n) 个正整数 (b_j)​​,表示第 (j) 个零售商店需要 (b_j) 个单位的货物。接下来的 (m) 行,每行有 (n) 个整数,表示从第 (i) 个仓库运送每单位货物到第 (j) 个零售商店的费用 (c_{ij})

    输出格式

    两行分别输出最小运输费用和最大运输费用。

    样例

    样例输入

    2 3
    220 280
    170 120 210
    77 39 105
    150 186 122
    

    样例输出

    48500
    69140
    

    数据范围与提示

    (1 leq n, m leq 100)

    题解

    费用流模板,大水题一道

    源点向仓库连容量为存货,费用为 (0) 的边

    商店向汇点连容量为需要,费用为 (0) 的边

    仓库到商店连上对应的边即可

    最大费用和最小费用本质相同,将边的费用变成相反数就可以了

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int MAXN=200+10,MAXM=MAXN*MAXN+10,inf=0x3f3f3f3f;
    int n,m,a[MAXN],b[MAXN],G[MAXN][MAXN],e,beg[MAXN],s,t,cur[MAXN],vis[MAXN],level[MAXN],to[MAXM<<1],nex[MAXM<<1],was[MAXM<<1],cap[MAXM<<1],clk,p[MAXN];
    ll answas;
    std::queue<int> q;
    template<typename T> inline void read(T &x)
    {
    	T data=0,w=1;
    	char ch=0;
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    	x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    inline void insert(int x,int y,int z,int k)
    {
    	to[++e]=y;
    	nex[e]=beg[x];
    	beg[x]=e;
    	cap[e]=z;
    	was[e]=k;
    	to[++e]=x;
    	nex[e]=beg[y];
    	beg[y]=e;
    	cap[e]=0;
    	was[e]=-k;
    }
    inline void build(int opt)
    {
    	e=1;memset(beg,0,sizeof(beg));answas=0;
    	for(register int i=1;i<=n;++i)insert(s,i,a[i],0);
    	for(register int i=1;i<=m;++i)insert(i+n,t,b[i],0);
    	for(register int i=1;i<=n;++i)
    		for(register int j=1;j<=m;++j)insert(i,j+n,inf,opt*G[i][j]);
    }
    inline bool bfs()
    {
    	memset(level,inf,sizeof(level));
    	level[s]=0;
    	p[s]=1;
    	q.push(s);
    	while(!q.empty())
    	{
    		int x=q.front();
    		q.pop();
    		p[x]=0;
    		for(register int i=beg[x];i;i=nex[i])
    			if(cap[i]&&level[to[i]]>level[x]+was[i])
    			{
    				level[to[i]]=level[x]+was[i];
    				if(!p[to[i]])p[to[i]]=1,q.push(to[i]);
    			}
    	}
    	return level[t]!=inf;
    }
    inline int dfs(int x,int maxflow)
    {
    	if(x==t||!maxflow)return maxflow;
    	vis[x]=clk;
    	int res=0;
    	for(register int &i=cur[x];i;i=nex[i])
    		if((vis[to[i]]^vis[x])&&cap[i]&&level[to[i]]==level[x]+was[i])
    		{
    			int f=dfs(to[i],min(maxflow,cap[i]));
    			cap[i]-=f;
    			cap[i^1]+=f;
    			res+=f;
    			answas+=1ll*f*was[i];
    			maxflow-=f;
    			if(!maxflow)break;
    		}
    	vis[x]=0;
    	return res;
    }
    inline int MCMF()
    {
    	int res=0;
    	while(bfs())clk++,memcpy(cur,beg,sizeof(cur)),res+=dfs(s,inf);
    	return res;
    }
    int main()
    {
    	read(n);read(m);
    	s=n+m+1,t=s+1;
    	for(register int i=1;i<=n;++i)read(a[i]);
    	for(register int i=1;i<=m;++i)read(b[i]);
    	for(register int i=1;i<=n;++i)
    		for(register int j=1;j<=m;++j)read(G[i][j]);
    	build(1);MCMF();write(answas,'
    ');
    	build(-1);MCMF();write(-answas,'
    ');
    	return 0;
    }
    
  • 相关阅读:
    oauth
    web api Authorization
    sql 找到前三
    js计算误差修正代码(真实版)
    js操作keyframes动态赋值
    元素拖拽缩放的jquery插件
    js生成组织结构树(原创)
    js图片拖拽、缩放、添加图层功能(原创)
    for循环,forin循环和Array.every(),obj.forEach()方法运行速度对比
    for循环+forin循环生成内容模版
  • 原文地址:https://www.cnblogs.com/hongyj/p/9433425.html
Copyright © 2020-2023  润新知