1. 程式人生 > >運輸問題(最小費用流)

運輸問題(最小費用流)

Description

    W公司有m個倉庫和n 個零售商店。第i 個倉庫有ai 個單位的貨物;第j 個零售商店需要bj個單位的貨物。貨物供需平衡,即
。從第i 個倉庫運送每單位貨物到第j 個零售商店的費用為Cij 。試設計一個將倉庫中所有貨物運送到零售商店的運輸方案,使總運輸費用最少。
    對於給定的m 個倉庫和n 個零售商店間運送貨物的費用,計算最優運輸方案和最差運輸方案。

Input

多組資料輸入.
每組輸入第1行有2 個正整數m和n,分別表示倉庫數和零售商店數。接下來的一行中有m個正整數ai ,1≤i≤m,表示第i個倉庫有ai 個單位的貨物。再接下來的一行中有n個正整數bj ,1≤j≤n,表示第j個零售商店需要bj 個單位的貨物。接下來的m行,每行有n個整數,表示從第i 個倉庫運送每單位貨物到第j個零售商店的費用Cij 。

Output

每組輸出最少運輸費用和最多運輸費用

Sample Input

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

Sample Output

48500

69140

題目出自nefu492

思路:

首先求最小費用,就是一個裸的最小費用最大流問題了,建立源點匯點,源點連線n個點,m個點連線匯點,然後n個點與m個點之間相互連邊,跑一個最小費用流就ok。

然後相對麻煩點兒的是最大費用,其實也不麻煩,只是建圖的時候稍微變一下就ok了,將n個點與m個點之間連邊的時候將其費用化成相反數,然後跑一遍最小費用流,結果取反就是anser~

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const   int oo=1e9;
const   int mm=11111111;
const   int mn=888888;
int node,src,dest,edge;
int ver[mm],flow[mm],cost[mm],nex[mm];
int head[mn],dis[mn],p[mn],q[mn],vis[mn];
/**這些變數基本與最大流相同,增加了cost 表示邊的費用,p記錄可行流上節點對應的反向邊*/
void prepare(int _node,int _src,int _dest)
{
    node=_node,src=_src,dest=_dest;
    for(int i=0; i<node; i++)head[i]=-1,vis[i]=0;
    edge=0;
}
void addedge(int u,int v,int f,int c)
{
    ver[edge]=v,flow[edge]=f,cost[edge]=c,nex[edge]=head[u],head[u]=edge++;
    ver[edge]=u,flow[edge]=0,cost[edge]=-c,nex[edge]=head[v],head[v]=edge++;
}
bool spfa()/**spfa 求最短路,並用 p 記錄最短路上的邊*/
{
    int i,u,v,l,r=0,tmp;
    for(i=0; i<node; ++i)dis[i]=oo;
    dis[q[r++]=src]=0;
    p[src]=p[dest]=-1;
    for(l=0; l!=r; (++l>=mn)?l=0:l)
        for(i=head[u=q[l]],vis[u]=0; i>=0; i=nex[i])
            if(flow[i]&&dis[v=ver[i]]>(tmp=dis[u]+cost[i]))
            {
                dis[v]=tmp;
                p[v]=i^1;
                if(vis[v]) continue;
                vis[q[r++]=v]=1;
                if(r>=mn)r=0;
            }
    return p[dest]>-1;
}
int SpfaFlow()/**源點到匯點的一條最短路即可行流,不斷的找這樣的可行流*/
{
    int i,ret=0,delta;
    while(spfa())
    {
        for(i=p[dest],delta=oo; i>=0; i=p[ver[i]])
            if(flow[i^1]<delta)delta=flow[i^1];
        for(i=p[dest]; i>=0; i=p[ver[i]])
            flow[i]+=delta,flow[i^1]-=delta;
        ret+=delta*dis[dest];
    }
    return ret;
}
int a[10005],b[10005],x[10005][10005];
int main()
{
    int m,n;
    while(~scanf("%d%d",&n,&m))
    {
        prepare(n+m+2,0,n+m+1);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            addedge(0,i,a[i],0);
        }
        for(int i=1; i<=m; i++)
        {
            scanf("%d",&b[i]);
            addedge(i+n,n+m+1,b[i],0);
        }
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
            {
                scanf("%d",&x[i][j]);
                addedge(i,j+n,oo,x[i][j]);
            }
        printf("%d\n",SpfaFlow());
        prepare(n+m+2,0,n+m+1);
        for(int i=1; i<=n; i++)
            addedge(0,i,a[i],0);
        for(int i=1; i<=m; i++)
            addedge(i+n,n+m+1,b[i],0);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                addedge(i,j+n,oo,-x[i][j]);
        printf("%d\n",-SpfaFlow());
    }
    return 0;
}

相關推薦

運輸問題費用

Description     W公司有m個倉庫和n 個零售商店。第i 個倉庫有ai 個單位的貨物;第j 個零售商店需要bj個單位的貨物。貨物供需平衡,即 。從第i 個倉庫運送每單位貨物到第j 個零售商店的費用為Cij 。試設計一個將倉庫中所有貨物運送到零售商店的運輸方案

【HDOJ6118】度度熊的交易計劃費用

const 費用流 sign else read true head 最大的 自動調整 題意: 度度熊參與了喵哈哈村的商業大會,但是這次商業大會遇到了一個難題:喵哈哈村以及周圍的村莊可以看做是一共由n個片區,m條公路組成的地區。由於生產能力的區別,第i個片區能夠花費a[i]

費用hdu 61182017百度之星初賽B 1005 度度熊的交易計劃

ios rsh des pty rank tom mis 註意 pan 度度熊的交易計劃 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su

hdu 4067 Random Maze費用

In the game “A Chinese Ghost Story”, there are many random mazes which have some characteristic: 1.There is only one entrance and

POJ 3422 - Kaka's Matrix Travels費用

題目連結 https://cn.vjudge.net/problem/POJ-3422 【題意】 給出一個N*N的矩陣,然後從左上角走到右下角,每次走只能是往下或者往右走,走一次就將這個位置上的數字加到sum和中,然後這個位置的數字置為0。從左上到右下走K次,問最大和。 【思路】 最

牛客國慶集訓派對Day6 A-Birthday 費用

題目描述 恬恬的生日臨近了。宇揚給她準備了一個蛋糕。 正如往常一樣,宇揚在蛋糕上插了n支蠟燭,並把蛋糕分為m個區域。因為某種原因,他必須把第i根蠟燭插在第ai個區域或第bi個區域。區域之間是不相交的。宇揚在一個區域內同時擺放x支蠟燭就要花費x2的時間。宇揚佈置蛋糕所用的

POJ 2135 Farm Tour 費用

Description When FJ’s friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000)

網路24題 P4015 運輸問題 大和費用

題目描述 WW 公司有 mm 個倉庫和 nn 個零售商店。第 ii 個倉庫有 a_iai​ 個單位的貨物;第 jj 個零售商店需要 b_jbj​ 個單位的貨物。 貨物供需平衡,即\sum\limits_{i=1}^{m}a_i=\sum\limits_{j=1}^{n}

HDU 3435A new Graph Game網絡費用

new ext 感覺 span hdu string.h return pri cpp 題目地址:HDU 3435 這題剛上來一看,感覺毫無頭緒。。再細致想想。。發現跟我做的前兩道費用流的題是差點兒相同的。能夠往那上面轉換。 建圖基本差點兒相同。僅僅只是這裏是無向圖。建

UVA 1658 - 海軍上將 費用+拆點

題目連結:https://vjudge.net/problem/UVA-1658 思路:拆點+最小費用流。這裡的拆點法是解決網路流限制點的常用辦法,因為如果直接刪除點,會影響很多邊,所以對每個非源點匯點的節點,將其拆成兩個節點,一個真節點,一個假節點,並在節點中建邊,容量為1,如果這條邊滿載了,

hdu5988費用浮點

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=5988 思路:求網路最小破壞可能,就是求最大不破壞的可能,再加上一個負號又變成了求最小費用流,對於乘法加上一個對數就變成了加法,需要注意的是對於浮點數要加上eps。 #pragma GCC o

海軍上將 費用+拆點

思路:拆點+最小費用流。這裡的拆點法是解決網路流限制點的常用辦法,因為如果直接刪除點,會影響很多邊,所以對每個非源點匯點的節點,將其拆成兩個節點,一個真節點,一個假節點,並在節點中建邊,容量為1,如果這條邊滿載了,說明這個真節點被訪問了,就可以通過限制邊來限制點了,所以最

洛谷 P4015 運輸問題費用

輸入輸出樣例 輸入樣例#1: 2 3 220 280 170 120 210 77 39 105 150 186 122 輸出樣例#1: 48500 69140 題意:中文題不說了 思路:注意,要求所有的貨物都要運送到商店,用最小費用最大流,保證在最大流的前提

【網路24題】運輸問題費用

題意 W 公司有 mmm 個倉庫和 nnn 個零售商店。第 iii 個倉庫有 aia_iai​​​ 個單位的貨物;第 jjj 個零售商店需要 bjb_jbj​​​ 個單位的貨物。貨物供需平衡,即∑i=1mai=∑j=1nbj​​\sum\limits_{i =

[CODEVS1915] 分配問題費用

min inline == getc digi empty getchar() clu spfa 傳送門 腦殘題 建圖都懶得說了 ——代碼 1 #include <queue> 2 #include

[luoguP2045] 方格取數加強版費用

col pid opened empty spl amp turn define aps 傳送門 水題 ——代碼 1 #include <queue> 2 #include <cstdio>

【網絡24題】餐巾計劃問題費用

open pre ++i 需求 http += cst efi pty 【網絡流24題】餐巾計劃問題(最小費用最大流) 題面 COGS 洛谷上的數據範圍更大,而且要開longlong 題解 餐巾的來源分為兩種: ①新買的 ②舊的拿去洗 所以,兩種情況分別建圖 先考慮第一種

P2153 [SDOI2009]晨跑費用

front 第一個 一個數 set ace include cpp radi n) 題目描述 Elaxia最近迷戀上了空手道,他為自己設定了一套健身計劃,比如俯臥撐、仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。 現在給出一張學校附近的地圖,這張地圖中包含N個十字

hdu 5988 Coding Contest費用

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=5988 A coding contest will be held in this university, in a huge playground. The

Going Home費用

Going Home http://poj.org/problem?id=2195 Time Limit: 1000MS   Memory Limit: 65536K Total Submi