网络流|★ POJ 2516 最小费用最大流(分开计算,K次费用流)

题意:给你m个供货源,n个店,k种商品,每个店对于每种商品的需求量以及每个供货源运送k种商品到相应店的费用,求最小费用。


分析:
1、直接暴力n*k+m*k个点建图加剪枝勉强过。
2、正解,对于每种物品,分开计算最小费用,最后相加即可。


代码1:

//O(Kn^2m) //如果要求最大费用的话 只需在加边的时候加-的边输出时输出-ans即可 #pragma comment(linker,"/STACK:102400000,102400000") #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; //记得必要的时候改成无符号 const int maxn=5005; const int maxm=1000005; const int INF=1000000000; struct EdgeNode { int from; int to; int flow; int cost; int next; }edge[maxm]; int head[maxn],cnt; void add(int x,int y,int z,int c) { edge[cnt].from=x; edge[cnt].to=y; edge[cnt].flow=z; edge[cnt].cost=c; edge[cnt].next=head[x]; head[x]=cnt++; edge[cnt].from=y; edge[cnt].to=x; edge[cnt].flow=0; edge[cnt].cost=-c; edge[cnt].next=head[y]; head[y]=cnt++; }void init() { cnt=0; memset(head,-1,sizeof(head)); }int S,T,n,m; int d[maxn],in[maxn],pre[maxn]; queueQ; bool spfa(int S,int T) { int u,v,f,c; while(!Q.empty())Q.pop(); memset(in,0,sizeof(in)); for(int i=0; i<=n; i++)d[i]=INF; d[S]=0; Q.push(S); while(!Q.empty()) { u=Q.front(); Q.pop(); in[u]=0; for(int i=head[u]; i!=-1; i=edge[i].next){ v=edge[i].to; f=edge[i].flow; c=edge[i].cost; if(f&&d[u]+c


代码2:
【网络流|★ POJ 2516 最小费用最大流(分开计算,K次费用流)】
//O(Kn^2m) //如果要求最大费用的话 只需在加边的时候加-的边输出时输出-ans即可 #pragma comment(linker,"/STACK:102400000,102400000") #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; //记得必要的时候改成无符号 const int maxn=205; const int maxm=1000005; const int INF=1000000000; struct EdgeNode { int from; int to; int flow; int cost; int next; }edge[maxm]; int head[maxn],cnt; void add(int x,int y,int z,int c) { edge[cnt].from=x; edge[cnt].to=y; edge[cnt].flow=z; edge[cnt].cost=c; edge[cnt].next=head[x]; head[x]=cnt++; edge[cnt].from=y; edge[cnt].to=x; edge[cnt].flow=0; edge[cnt].cost=-c; edge[cnt].next=head[y]; head[y]=cnt++; }void init() { cnt=0; memset(head,-1,sizeof(head)); }int S,T,n,m; int d[maxn],in[maxn],pre[maxn]; queueQ; bool spfa(int S,int T) { int u,v,f,c; while(!Q.empty())Q.pop(); memset(in,0,sizeof(in)); for(int i=0; i


    推荐阅读