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