[网络流24题] 运输问题

题目链接:戳我
最小费用最大流。
代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define S 0
#define T n+m+1
#define MAXN 210
using namespace std;
int n,m,t=1,c,f;
int head[100010],pre_v[MAXN],pre_e[MAXN],dis[MAXN],done[MAXN];
int a[MAXN],b[MAXN],trans[MAXN][MAXN];
struct Edge{int nxt,to,dis,cost;}edge[100010];
inline void add(int from,int to,int dis,int cost)
{
    edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,edge[t].cost=cost,head[from]=t;
    edge[++t].nxt=head[to],edge[t].to=from,edge[t].dis=0,edge[t].cost=-cost,head[to]=t;
}
inline bool spfa()
{
    memset(dis,0x3f,sizeof(dis));
    queue<int>q;
    q.push(S); dis[S]=0; done[S]=1;
    while(!q.empty())
    {
        int u=q.front();q.pop();done[u]=0;
        for(int i=head[u];i;i=edge[i].nxt)
        {
            int v=edge[i].to;
            if(edge[i].dis&&dis[u]+edge[i].cost<dis[v])
            {
                dis[v]=dis[u]+edge[i].cost;
                pre_v[v]=u,pre_e[v]=i;
                if(!done[v]) q.push(v),done[v]=1;
            }
        }
    }
    if(dis[T]==0x3f3f3f3f) return false;
    int flow=(int)1e9;
    for(int i=T;i!=S;i=pre_v[i]) flow=min(flow,edge[pre_e[i]].dis);
    for(int i=T;i!=S;i=pre_v[i]) edge[pre_e[i]].dis-=flow,edge[pre_e[i]^1].dis+=flow;
    c+=flow*dis[T];
    f+=flow;
    return true;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&trans[i][j]);
    for(int i=1;i<=m;i++) add(S,i,a[i],0);
    for(int i=1;i<=n;i++) add(i+m,T,b[i],0);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            add(i,j+m,(int)1e9,trans[i][j]);
    while(spfa());
    printf("%d\n",c);
    memset(head,0,sizeof(head));
    t=1,c=0,f=0;
     for(int i=1;i<=m;i++) add(S,i,a[i],0);
    for(int i=1;i<=n;i++) add(i+m,T,b[i],0);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            add(i,j+m,(int)1e9,-trans[i][j]);
    while(spfa());
    printf("%d\n",-c);
    return 0;
}

原文地址:https://www.cnblogs.com/fengxunling/p/10296552.html

时间: 2024-10-16 02:42:54

[网络流24题] 运输问题的相关文章

739. [网络流24题] 运输问题

739. [网络流24题] 运输问题 ★★   输入文件:tran.in   输出文件:tran.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述:«编程任务:对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案.«数据输入:«结果输出:程序运行结束时,将计算出的最少运输费用和最多运输费用输出到文件tran.out中.输入文件示例 输出文件示例tran.in2 3220 280170 120 21077 39 105 150 186 1

网络流24题-运输问题(费用流)

题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai? 个单位的货物:第 jj 个零售商店需要 b_jbj? 个单位的货物. 货物供需平衡,即\sum\limits_{i=1}^{m}a_i=\sum\limits_{j=1}^{n}b_ji=1∑m?ai?=j=1∑n?bj?. 从第 ii 个仓库运送每单位货物到第 jj 个零售商店的费用为 c_{ij}cij??? . 试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少. 输入输出格式 输

【费用流】【网络流24题】【cogs 739】运输问题

739. [网络流24题] 运输问题 ★★ 输入文件:tran.in 输出文件:tran.out 简单对比 时间限制:1 s 内存限制:128 MB ?问题描述: ?编程任务: 对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案. ?数据输入: ?结果输出: 程序运行结束时,将计算出的最少运输费用和最多运输费用输出到文件tran.out中. 输入文件示例 输出文件示例 tran.in 2 3 220 280 170 120 210 77 39 105 150 1

【网络流24题】运输问题(费用流)(网络费用流量)

[网络流24题]运输问题 2014年3月7日1,6360 题目描述 Description W 公司有m个仓库和n 个零售商店.第i 个仓库有ai 个单位的货物:第j 个零售商店需要bj个单位的货物.货物供需平衡,即  sum(si)=sum(bj).从第i 个仓库运送每单位货物到第j 个零售商店的费用为cij .试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少.编程任务:对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案. 输入描述 Inp

网络流24题 -No.18 分配问题

问题描述 有 n件工作要分配给 n个人做.第 i 个人做第 j 件工作产生的效益为c[i,j] .试设计一个将n 件工作分配给 n个人做的分配方案,使产生的总效益最大. 编程任务对于给定的 n件工作和 n 个人,计算最优分配方案和最差分配方案. 数据输入输入的第 1 行有 1 个正整数 n,表示有 n件工作要分配给 n 个人做.接下来的 n 行中,每行有 n 个整数c[i,j],1≤i≤n,1≤j≤n,表示第 i 个人做第 j 件工作产生的效益为c[i,j] . 结果输出程序运行结束时,输出最小

「网络流24题」 题目列表

「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题

网络流24题之分配问题

题目链接:传送门 这道题和运输问题也是贼相似的,几乎一模一样 详细见网络流24题之分配问题 #include<bits/stdc++.h> using namespace std; typedef long long ll; int read(){ int x=0,f=1; char c=getchar(); while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar(); while(c>='0'&&c<='9') x=

网络流24题小结

网络流24题 前言 网络流的实战应用篇太难做了,因此先完善这一部分 ## 第一题:飞行员配对方案 \(BSOJ2542\)--二分图 最优匹配 题意 两国飞行员\(x\)集合\(y\)集合,\(x\)飞行员可以配对特定的\(y\)集合的飞行员(可无),求一对一配对最大数 Solution 二分图最大匹配裸题,最大流实现 建图:(设\(i\in x\)而\(i'\in y\)) \((S,i,1)~(i',T,1)\) 对\((i,j')\)可匹配\((i,j',1)\) Code 略 ## 第二

【网络流24题----14】孤岛营救问题

孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形,其南北方向被划分为 N行,东西方向被划分为 M列,于是整个迷宫被划分为 N×M个单元.每个单元的位置可用一个有序数对 (单元的行号,单元的列号)来表示.南北或东西方向相邻的 2个单元之间可能互