题意:有N个供应商,M个店主,K种物品。每个供应商对每种物品的的供应量已知,每个店主对每种物品的需求量的已知,从不同的供应商运送不同的货物到不同的店主手上需要不同的花费,又已知从供应商m送第k种货物的单位数量到店主n手上所需的单位花费。供应是否满足需求?如果满足,最小运费是多少?

思路:这题一读完就知道是费用流了,刚开始想着拆点,不过算了一下,把m个供应商拆成m*k个点,n个店主拆成n*k个点,加起来有5000多个点,肯定会超时的,看了网上说每种商品求一次费用流就可以了,就是100个点求50次。

#include<stdio.h>
#include<queue>
#include<string.h>
const int inf=0x3fffffff;
const int N=200;
using namespace std;
int dis[N],start,end,head[N],num,sum,pre[N],vis[N],mincost;
int in[51][51],out[51][51],link[51][51][51];
struct edge
{
int st,ed,flow,cost,next;
}e[N*N];
void addedge(int x,int y,int f,int c)
{
e[num].st=x;e[num].ed=y;e[num].flow=f;e[num].cost=c; e[num].next=head[x];head[x]=num++;
e[num].st=y;e[num].ed=x;e[num].flow=0;e[num].cost=-c;e[num].next=head[y];head[y]=num++;
}
bool spfa()
{
queue<int>Q;
int i,u,v;
for(i=start;i<=end;i++)
{
pre[i]=-1;
dis[i]=inf;
vis[i]=0;
}
dis[start]=0;
vis[start]=1;
Q.push(start);
while(!Q.empty())
{
u=Q.front();
Q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].ed;
if(e[i].flow<=0)continue;
if(dis[v]>dis[u]+e[i].cost)
{
dis[v]=dis[u]+e[i].cost;
pre[v]=i;
if(!vis[v])
{
Q.push(v);
vis[v]=1;
}
}
}
}
if(pre[end]==-1)
return false;
return true;
}
void Mincost()
{
int i,minflow,maxflow=0;
mincost=0;
while(spfa())
{
minflow=inf;
for(i=pre[end];i!=-1;i=pre[e[i].st])
if(minflow>e[i].flow)
minflow=e[i].flow;
for(i=pre[end];i!=-1;i=pre[e[i].st])
{
e[i].flow-=minflow;
e[i^1].flow+=minflow;
mincost+=minflow*e[i].cost;
}
maxflow+=minflow;
}
if(maxflow!=sum)
mincost=-1;
}
int main()
{
int i,j,n,k,m,h,sum1,cost;
while(scanf("%d%d%d",&n,&m,&k),n+m+k)
{
start=0,end=n+m+1;cost=0;
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
scanf("%d",&out[i][j]);
for(i=1;i<=m;i++)
{
for(j=1;j<=k;j++)
scanf("%d",&in[i][j]);
}
for(i=1;i<=k;i++)
{
for(j=1;j<=n;j++)
for(h=1;h<=m;h++)
scanf("%d",&link[i][j][h]);
}
for(i=1;i<=k;i++)//第i种商品
{
memset(head,-1,sizeof(head));
num=0;sum=0;sum1=0;
for(j=1;j<=n;j++)//商店需要的i种商品
{
sum+=out[j][i];
addedge(m+j,end,out[j][i],0);
}
for(j=1;j<=m;j++)
{
addedge(start,j,in[j][i],0);
sum1+=in[j][i];
}
if(sum1<sum)break;//如果i商品供不应求
for(j=1;j<=n;j++)
{
for(h=1;h<=m;h++)
addedge(h,j+m,in[h][i],link[i][j][h]);
}
Mincost();
if(mincost==-1)break;//第i种商品不能满足
cost+=mincost;
}
if(i<=k)printf("-1\n");//有商品不能满足
else printf("%d\n",cost);
}
return 0;
}

poj 2516 (费用流)的更多相关文章

  1. poj 2175 费用流消圈

    题意抽象出来就是给了一个费用流的残存网络,判断该方案是不是最优方案,如果不是,还要求给出一个更优方案. 在给定残存网络上检查是否存在负环即可判断是否最优. 沿负环增广一轮即可得到更优方案. 考虑到制作 ...

  2. Going Home POJ - 2195 费用流板子题

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...

  3. poj 3422 (费用流)

    从左上角到有下角k次能获得的最大值. 跟hdu 2686一样的题目,这题一个点可以重复走,只能得到一次值. #include<stdio.h> #include<string.h&g ...

  4. Going Home POJ - 2195(费用流)

    就是一个简单题 四个月前a的一道题,今天又看到了,再a一遍吧. 好吧 我想多了 用了bfs求最短路  其实不用的 因为没有障碍物 #include <iostream> #include ...

  5. POJ 2516 Minimum Cost (最小费用最大流)

    POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...

  6. POJ - 2516 Minimum Cost 每次要跑K次费用流

    传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源 ...

  7. POJ 2516 Minimum Cost (费用流)

    题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...

  8. POJ - 2516 Minimum Cost(最小费用最大流)

    1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...

  9. Minimum Cost 【POJ - 2516】【网络流最小费用最大流】

    题目链接 题意: 有N个商家它们需要货物源,还有M个货物供应商,N个商家需要K种物品,每种物品都有对应的需求量,M个商家每种物品都是对应的存货,然后再是K个N*M的矩阵表示了K个物品从供货商运送到商家 ...

随机推荐

  1. Zookeeper 3、Zookeeper工作原理(详细)

    1.Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新系统状态 » 学习者(learner),包括跟随者(follower)和观察者(observer),follow ...

  2. 使用 apache ant 轻松实现文件压缩/解压缩(转)

    原文地址:http://blog.csdn.net/irvine007/article/details/6779492 maven配置ant包: <dependency> <grou ...

  3. BCD码、十六进制与十进制互转

    在做嵌入式软件的设计中,常常会遇到十六进制.BCD码与十进制之间的转换,近期做M1卡的应用中,涉及了大量的十六进制.BCD码与十进制之间的转换.通过对BCD码.十六进制 权的理解,轻松的实现了他们之间 ...

  4. PHP常用内置函数

    $_SERVER['SCRIPT_NAME'] 返回/mantis/test.php 相对路径 __FILE__返回文件的绝对路径 $_SERVER['HTTP_X_FORWARDED_PROTO'] ...

  5. iframe 重新加载闪过白块问题

    在使用iframe时,iframe背景为白块,刷新时也会闪过白块.如果刷新时间长,就会一直出现白块,让人很烦恼,通过网上搜资料,测试最终解决方法如下所示,注意主要针对IE浏览器测试. 一.iframe ...

  6. PHP学习笔记十四【面向对象】

    <?php class Cat{ public $name; public $age; public $color; } //创建一个对象 $cat1=new Cat(); $cat1-> ...

  7. C++程序设计实践指导1.6分数运算改写要求实现

    改写要求:重载>>和<<实现分数类对象的直接输入输出,重载+完成多个分数对象加法 #include <cstdlib> #include <iostream& ...

  8. 【典型错误】The type java.lang.Object cannot be resolved.

    参考:http://blog.csdn.net/wo519074786/article/details/7697967 The type java.lang.Object cannot be reso ...

  9. Apache无法启动解决方案

    Apache无法启动错误原因: 原因一:80端口占用例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开 ...

  10. python之列表、字典的使用

    一.概述:以后你在Linux里面写Python脚本的时候会经常用到Python列表.字典,因为你在以后写脚本的时候,大多数情况下都是对文件进行操作处理,使用字典和列表可以很好的操作文件,得出你想要的结 ...