poj2516 最小费用最大流
第一次见到这样的题,真的是看别人的思想然后看别人的代码了一晚上,先明白别人的代码的意思,但是不懂为什么那么写,然后画个图忽然就明白了,下面就是根据这道题最初最小费用最大流的分析!
题目大意:给出n个客户对k个商品的需求量,又给出m个仓库对k个物品的存货量以及对k个物品从i仓库到j客户的一个物品的运费价格,让判断是否可以满足客户需求,然后就是如果满足求出最小的运费,是典型的最小费用最大流!
题目解析:可以将k中物品分开求最小然后想加!
建图,对每个仓库是一个结点,每个客户也是一个结点,除此之外再加上s源点和t结束点!
1、s到仓库i的边的权值为仓库i的供给量
2、仓库i到客户j的权值为仓库的供给量
3、客户j到t的权值为客户的需求量
4、还有建立花费图,cost[i][j]代表仓库i到客户j的没一个物品的运费
然后用spfa算法求s到t的最小路径(路径上边的权值不为0),如果到t的最短路径有更新(此条路径话费最少),则记录这条路径,求出这条路径上权值最小的边的权值,然后这条路径上所有的边的权值都减去该边的权值min,此时最小的花费增加了min*在这条边上的花费!如果s到t的值没有更新,则对于k物品的最小花费则已经求出来了!
表达能力不强,脑袋清楚说不出来,下面是代码,如果实在不明白的话就好好看看代码哈!
- #include<iostream>
- #include<cstdio>
- #include<string>
- #include<cmath>
- #include<queue>
- using namespace std;
- #define min(a,b) (a)<(b)?(a):(b)
- #define N 130
- #define inf 100000000
- int need[N][N];
- int offer[N][N];
- int map[N][N],cost[N][N];
- int sum_need[N],sum_offer[N];
- int n,m,K;
- int pre[N];
- int s,t;//源点和结束点
- int spfa()
- {
- int dis[N];
- bool vis[N];
- int i;
- queue<int>q;
- for(i=0; i<=t; i++)
- {
- vis[i]=false;
- dis[i]=inf;
- }
- vis[s]=true;
- dis[s]=0;
- q.push(s);
- while(!q.empty())
- {
- int k=q.front();
- vis[k]=false;
- q.pop();
- for(i=0; i<=t; i++)
- {
- if(map[k][i] && dis[i]>dis[k]+cost[k][i])
- {
- dis[i]=dis[k]+cost[k][i];
- pre[i]=k;
- if(vis[i]==false)
- {
- vis[i]=true;
- q.push(i);
- }
- }
- }
- }
- if(dis[t]!=inf)
- return 1;
- else
- return 0;
- }
- int fond()
- {
- int i,j;
- int Min=INT_MAX;
- j=0;
- while(spfa())
- {
- for(i=t;i!=s; i=pre[i])
- Min=min(Min,map[pre[i]][i]);
- for(i=t; i!=s; i=pre[i])
- {
- map[pre[i]][i]-=Min;
- map[i][pre[i]]+=Min;
- j+=cost[pre[i]][i]*Min;
- }
- }
- return j;
- }
- int main()
- {
- int i,j,k,sum,sign;
- while(scanf("%d%d%d",&n,&m,&K))
- {
- if(n==0 && m==0 && K==0)
- break;
- sum=0;
- memset(sum_need,0,sizeof(sum_need));
- memset(sum_offer,0,sizeof(sum_offer));
- for(i=1; i<=n; i++)
- for(j=1; j<=K; j++)
- {
- scanf("%d",&need[i][j]);
- sum_need[j]+=need[i][j];
- }
- for(i=1; i<=m; i++)
- for(j=1; j<=K; j++)
- {
- scanf("%d",&offer[i][j]);
- sum_offer[j]+=offer[i][j];
- }
- sign=0;
- for(i=1; i<=K; i++)
- if(sum_offer[i]<sum_need[i])
- {
- sign=1;
- break;
- }
- s=0;
- t=m+n+1;
- for(k=1; k<=K; k++)
- {
- for(i=0; i<=t; i++)
- for(j=0; j<=t; j++)
- map[i][j]=cost[i][j]=0;
- for(i=1+m; i<=n+m; i++)
- for(j=1; j<=m; j++)
- {
- scanf("%d",&cost[j][i]);
- cost[i][j]=-cost[j][i];
- }
- if(sign==1)
- continue;
- for(i=1; i<=m; i++)
- map[s][i]=offer[i][k];
- for(i=1; i<=m; i++)
- for(j=1+m; j<=n+m; j++)
- map[i][j]=offer[i][k];
- for(i=m+1; i<=m+n; i++)
- map[i][t]=need[i-m][k];
- sum+=fond();
- }
- if(sign==1)
- printf("-1\n");
- else
- printf("%d\n",sum);
- }
- return 0;
- }
poj2516 最小费用最大流相关推荐
- 网络流之——最小费用最大流
学习最小费用最大流前,需要学习最大流算法.在最大流算法中,没有考虑边的费用问题.在MinCostMaxFlow中,引入了费用的概念:cij表示边(i,j)单位流量的费用.在满足流量=v(f)的同时,并 ...
- 最小费用最大流及习题(poj)
该算法讲解来源:https://www.cnblogs.com/gtarcoder/p/4890739.html 最小费用最大流 通过EK,Dinic,ISAP算法可以得到网络流图中的最大流,一个网络 ...
- 乌鲁木齐网络赛J题(最小费用最大流模板)
ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报 分类: 网络流(33) 版权声 ...
- POJ - 2516 Minimum Cost 最小费用最大流
题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...
- pku The Windy's KM最小权匹配 or 最小费用最大流
http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...
- c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...
目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...
- 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)
题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai,ai+n一个点为入点,一个为出点这条边的流量范围 ...
- 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)
题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...
- Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...
最新文章
- 达摩院NLP团队斩获六项世界冠军背后,让AI没有难懂的语言
- 科技边框_爱旭科技首创双面PERC电池PID FREE解决方案
- Android中的URI
- python代码大全表解释-.python3基础之“术语表(1)”
- jzoj6305-最小值【线段树,dp,双端链表】
- 第五十七期:小型企业将如何从5G中受益
- 一周学C#之第4天——语句
- 滚动字幕的源代码(可作滚动公告)
- 汽车门店管理系统 php,大型汽车4s店维修管理系统多门店版(源码+数据库+截图)...
- 2022年上半年软件设计师下午真题试题(案例分析)及答案
- rsyslog+elk 网络设备日志收集及钉钉报警
- Python标准库:内置函数complex([real[, imag]])
- Bupt桌游馆--共享资源清单
- 12.9寸iPad Pro 5曝光:屏幕焕然一新、处理器强悍
- 最短路——最短路计数(spfa)
- android 远程控制 盒子,真正远程控制你的盒子(局域网和互联网)
- 修复 rk3288 android9 的一些问题
- css 实现居中对齐的几种方式
- A4纸网页打印 html网页页面的宽度设置成多少
- Premiere使用教程(二)界面介绍
热门文章
- 【Android 逆向】函数拦截 ( 修改内存页属性 | x86 架构插桩拦截 )
- 【错误记录】Android Studio Logcat 报错 ( read: unexpected EOF! )
- 【Flutter】Animation 动画 ( Flutter 动画的核心类 | Animation | CurvedAnimation | AnimationController | Tween )
- 【错误记录】Flutter 构建报错 ( Because xxx requires SDK version >=2.12.0-0 <3.0.0, versio | Dart SDK 版本低 )
- 【Android应用开发】RecycleView API 翻译 (文档翻译)
- [Spring cloud 一步步实现广告系统] 15. 使用开源组件监听Binlog 实现增量索引准备...
- 初识HTML和WEB标准
- Linux 查看 80 端口的占用情况
- 技术分享-bounds的深入认识
- 局部和匿名类型作模板实参