E - Minimum Cost - POJ 2516(最小费)

时间:2023-03-09 00:33:45
E - Minimum Cost - POJ 2516(最小费)
题目大意:N个客户,M个供货商,K种商品,现在知道每个客户对每种商品的需求量,也知道每个供货商每种商品的持有量,和供货商把一种商品运送到每个客户的单位花费。现在想知道如果能满足所有客户的最小花费是多少,如果不能满足输出 -1
输入详解:(图片引用源自http://blog.****.net/lyy289065406/article/details/6742534)。

E - Minimum Cost - POJ 2516(最小费)

分析:第一次做的时候想到把供应商的每种商品和客户的需求的每种商品直接连接然后求最大流,不过CE了,想着数据都是50也不大,不过仔细一想 50*50*50那就很大了,我的数组只开了500....然后想了一下觉得边是非常少的于是换成了邻接矩阵储存,然后果断给了一个TLE,下面是超时代码

E - Minimum Cost - POJ 2516(最小费)E - Minimum Cost - POJ 2516(最小费)
#include<stdio.h>
#include<;
;

];
; i<=End; i++)
        dist[i] = oo, pre[i]=-;
    dist[start] = ;

; i=edge[i].next)
        {
            , cost=;

; i=pre[edge[i].u])
            MinFlow = min(MinFlow, edge[i].flow);
        ; i=pre[edge[i].u])
        {
            edge[i].flow -= MinFlow;
            edge[i^].flow += MinFlow;
            cost += edge[i].cost;
        }

MaxFlow += MinFlow;
    }

;
        , End = start+;

; i<=End; i++)
            Head[i] = -;
        cnt = ;

; i<N; i++)
        ; j<=K; j++)
        {);
            AddEdge(End, nk, , );
            needFlow += x;
        }

; i<M; i++)
        ; j<=K; j++)
        {);
            AddEdge(mk, start, , );
        }

; k<=K; k++)
        ; i<N; i++)
        ; j<M; j++)
        {, -x);
        }

MinCost(start, End, needFlow);
    }

;
}

然后就有些不知该怎么搞,只能向大神求助,看了别人的思路,原来这是多源多汇的费用流问题,看到这里也就明白了怎么做把K种商品拆开,对每一种商品进行最小费处理,这样图只有100*100,然后最多操作50次,很容易就求出来了结果。下面是AC代码。

E - Minimum Cost - POJ 2516(最小费)E - Minimum Cost - POJ 2516(最小费)
#include<stdio.h>
#include<;
;

};

; i<=End; i++)
        dist[i] = oo;
    dist[start] = ;

; i<=End; i++)
        {
            , cost=, pre[MAXN]={};

;

;

; i<=N; i++)
        ; j<=K; j++)
        {; i<=M; i++)
        ; j<=K; j++)
        {; k<=K; k++)
        {, ; i<=N; i++)
            ; j<=M; j++)
            {, End = start+;
                ;; i<=M; i++)
                {; i<=N; i++)
                {)
                    ok = ;
        printf(;
}