POJ 2516 基础费用流】的更多相关文章

题意       有n个顾客,m个供应商,k种货物,给你顾客对于每种货物的要求个数,和供应商对于每种货物的现有量,以及供应每种货物的时候供应商和顾客之间的运输单价,问你满足所有顾客的前提下的最小运输费用是多少. 思路:       满足所有顾客的前提下的最小花费,很容易就想到了费用流,但是做这个题目有个小窍门,如果不想的话很可能把每个点拆成三个点,然后在去跑,但是这样感觉写着麻烦,AC肯定没问题,但是仔细想想,每种货物之间是没有任何关系的,那么我们何不直接每种货物都跑一遍费用流,这样写起来很简单…
题意:从1到n再到1,每条边只能走一次,求最短距离. 建图:每条边只能走一次就是流量是1,添加源点与1相连,容量为2,费用为0,n与汇点相连容量为2,费用为0: 求增广路用SPFA最短路求,, #include<stdio.h> #include<queue> #include<string.h> const int N=1100; const int inf=0x3fffffff; using namespace std; int cost[N],start,end,…
题意:       题意是一个人他要从牧场1走到牧场n然后在走回来,每条路径只走一次,问全程的最短路径是多少. 思路:        这个题目挺简单的吧,首先要保证每条边只能走一次,然后还要要求费用最小,那么我们可以直接跑费用流啊!还有题目说的是去了又回来,这个地方我们可以直接一次跑出两条路径,就是起始的时候的流量是2就行了,然后一遍费用流,然后就wa了,这个题目最坑人的地方就是他的输入叙述,说的什么The starting field, the end field, and the path'…
每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^1].c += aug; 4: 5: */ 6: #include <queue> 7: #include <iostream> 8: #include <string.h> 9: #include <stdio.h> 10: #include <map&…
http://poj.org/problem?id=3680 巧妙的构图. 题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次. 构图:将区间端点离散化,将第i个点连第i+1个点花费为0,容量为INF,即addedge(i,i+1,0,INF)(可用来跳过一些区间); 再处理N个区间(ai,bi),addedge(ai,bi,-wi,1); 最后源点连第一个点,addedge(src,1,0,k);最后一个点连汇点,addedge(n,sink,0,k). 原理:构完图之后…
题意:给出n栋房子位置和每栋房子里面的人数,m个避难所位置和每个避难所可容纳人数.然后给出一个方案,判断该方案是否最优,如果不是求出一个更优的方案. 思路:很容易想到用最小费用流求出最优时间,在与原方案花费时间对比判断原方案是否最优.也许是组数太多了,这种方法会超时的. 放弃该思路. 看看题目没要求要最优解,而是得到一个更优的解. 在原图的所有反向边中能够找到一个总费用为负的回路(而且要有流量)的话,那就该解不是最优解,把该负环消去,更新流量,得到优化后的解.(原因: 反向边保存的是已经流过的流…
虽然算法还没有理解透,但以及迫不及待地想要A道题了. 非常裸的最大流,试试lrj的模板练练手. #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; + ; ; struct Edge { int from, to, cap, flow; Edge(int u, int v,…
POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一个商人要购买的物品,当中K个数分别表示要购买的每件商品数. 然后是M行K个数,每行表示仓库里的情况,当中K个数分别每种物品的库存量. 接下来是K个矩阵,每一个矩阵为N*M,分别表示第K种物品从M个仓库运到第N个商人的花费.问是否能合理安排,使得花费最少.假设不行就输出-1. 思路: 一開始的时候.居…
传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源点S和汇点T,从源点S到每个仓库(1-m)连上容量为商品A的库存.费用为0的边,每个仓库再向每个不同的买家连上容量inf,费用为路费的边.每个顾客向汇点连一条容量为自己对商品A的需求个数.费用为0的边.跑一边费用流即可.这只有运送一个商品的费用,对,那我们就对不同商品建不同的图,一共跑K边,累计答案…
题意:有N个供应商,M个店主,K种物品.每个供应商对每种物品的的供应量已知,每个店主对每种物品的需求量的已知,从不同的供应商运送不同的货物到不同的店主手上需要不同的花费,又已知从供应商m送第k种货物的单位数量到店主n手上所需的单位花费.供应是否满足需求?如果满足,最小运费是多少? 思路:这题一读完就知道是费用流了,刚开始想着拆点,不过算了一下,把m个供应商拆成m*k个点,n个店主拆成n*k个点,加起来有5000多个点,肯定会超时的,看了网上说每种商品求一次费用流就可以了,就是100个点求50次.…
题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N) which stocks goods from him.Dearboy has M supply places (marked from 1 to M), each provides K different k…
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品进行最小费用最大流计算. 建立超级源点和超级汇点:超级源点流向M个供应商,容量为供应商的存储量,费用为0:N个收购商流向超级源点,容量为收购商的需求量,费用为0. 另外,供应商流向收购商,容量为无穷大,费用为对应的单位运费. 3. 1.Bellman-Ford: #include<iostream>…
题目链接 题意: 有N个商家它们需要货物源,还有M个货物供应商,N个商家需要K种物品,每种物品都有对应的需求量,M个商家每种物品都是对应的存货,然后再是K个N*M的矩阵表示了K个物品从供货商运送到商家的单位上的价钱,那么就是标准的最大流最小费用了,我们只需要建立这样的边,对于所有的供应商都与源点建立流的大小为拥有的个数的边.与商家建立无穷大的边并且边的代价是单位流的代价,然后再由商家出发到达汇点建立流大小为其需要的边,与汇点和源点建立的边的代价都是0. 思路: 一开始的时候,我计划直接跑一次费用…
题目链接: Poj  2516  Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求量.不同的商店从不同的仓库购买不同货物花费不同,问是不是能满足所有商店的要求,如果能商店花费总和最小为多少? 解题思路: 简单的费用流,要跑K次最小花费最大流,每次只对一种货物建图跑费用流.每次建图以0为源点, [1,m]为仓库, [m+1, n+m]为商店, n+m+1为汇点.0与[1,m]连边,…
http://poj.org/problem?id=2175 Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3256   Accepted: 855   Special Judge Description The City has a number of municipal buildings and a number of fallout shelters that were build…
POJ 3422 Kaka's Matrix Travels 题目链接 题意:一个矩阵.从左上角往右下角走k趟,每次走过数字就变成0,而且获得这个数字,要求走完之后,所获得数字之和最大 思路:有点类似区间k覆盖的建图方法,把点拆了,每一个点有值的仅仅能选一次,其它都是无值的.利用费用流,入点出点之间连一条容量1,有费用的边,和一条容量k - 1,费用0的边,然后其它就每一个点和右边和下边2个点连边.然后跑费用流 代码: #include <cstdio> #include <cstrin…
http://poj.org/problem?id=2195 题意: 在一个网格地图上,有n个小人和n栋房子.在每个时间单位内,每个小人可以往水平方向或垂直方向上移动一步,走到相邻的方格中.对每个小人,每走一步需要支付1美元,直到他走入到一栋房子里.每栋房子只能容纳一个小人. 计算出让n个小人移动到n个不同的房子需要支付的最小费用. 思路: 源点和每个人相连,容量为1,费用为0. 汇点和每栋房子相连,容量为1,费用为0. 每个人和每栋房子相连,容量为1,费用为人和房子之间的距离. 这样一来,跑一…
题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用为0,然后就是对区间端点进行连边,容量为1,费用为权值,最后就是跑费用流了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue&…
[题目链接] http://poj.org/problem?id=3068 [题目大意] 给出一张图,要把两个物品从起点运到终点,他们不能运同一条路过 每条路都有一定的费用,求最小费用 [题解] 题目等价于求两条无交叉最短路,可用流量为2的费用流求解 [代码] #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; con…
[题目链接] http://poj.org/problem?id=3686 [题目大意] 每个工厂对于每种玩具的加工时间都是不同的, 并且在加工完一种玩具之后才能加工另一种,现在求加工完每种玩具的平均时间 [题解] 因为每个工厂加工一个零件在不同的时间是有不同代价的, 我们发现对于一个工厂在每次加工一个零件时候,时间要加上之前所有的零件的时间的条件 其实等价于对这个工厂加工的零件乘上1~N的不同系数. 那么我们将这个工厂对于时间进行拆点,对于费用乘上不同的系数,求一遍费用流即可 [代码] #in…
[题目链接] http://poj.org/problem?id=2135 [题目大意] 有一张无向图,求从1到n然后又回来的最短路 同一条路只能走一次 [题解] 题目等价于求从1到n的两条路,使得两条路的总长最短 那么就等价于求总流量为2的费用流 [代码] #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #i…
http://poj.org/problem?id=2195 对km算法不理解,模板用的也不好. 下面是大神的解释. KM算法的要点是在相等子图中寻找完备匹配,其正确性的基石是:任何一个匹配的权值之和都不大于所有顶点的顶标之和,而能够取到相等的必然是最大权匹配. 左右两边点数不等时,KM算法的正确性也是可以得到保证的.原因如下: 由KM算法中可行点标的定义,有: 任意匹配的权值 <= 该匹配所覆盖的所有点的顶标值 <= KM算法所得到的匹配所覆盖的所有点的顶标值 = KM算法所得到的的匹配的权…
题意 给出一个n*n大小的矩阵,要求从左上角走到右下角,每次只能向下走或者向右走并取数,某位置取过数之后就只为数值0,现在求解从左上角到右下角走K次的最大值. 思路 经典的费用流模型:K取方格数. 构图方法:将矩阵的每个元素m[i][j]拆成两个点u=(i-1)*n+j和v=n*n+(i-1)*n+j,从u到v连两条边: 1> 连边(u,v),容量为1,费用值为m[i][j],这样可以保证每一个位置的数只被取一次 2> 连边(u,v),容量为INF,费用值为0,这样可以保证某位置取数被置为0之…
从1走到N然后从N走回来的最短路程是多少? 转换为费用流来建模. 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^1].c += aug; 4: 5: */ 6: #include <queue> 7: #include <iostream> 8: #include <string.h> 9: #include <stdio.h> 10: #include &…
题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用流第一题, 将每个格子拆为两个点, u向u'连一条容量为1, 费用为格子的值的边, u向u'再连一条容量为k-1, 费用为0的边.u'向他右边和下边的格子连一条容量为k, 费用为0的边, 跑一遍费用流就可以. #include <iostream> #include <vector>…
题面 On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to an adjacent point. For each little man, you need to pay a $1 travel fee for every step he moves,…
题目链接 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18961   Accepted: 7326 Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the fir…
题意抽象出来就是给了一个费用流的残存网络,判断该方案是不是最优方案,如果不是,还要求给出一个更优方案. 在给定残存网络上检查是否存在负环即可判断是否最优. 沿负环增广一轮即可得到更优方案. 考虑到制作模板的需要,我用前向星建图做的.此题用邻接矩阵应该更方便. #include<queue> #include<cstdio> #include<algorithm> #include<cstring> #define rep(i,a,b) for(int i=a…
累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连一条流量为1(花费依据题意来定) 的边来控制每一个点仅仅能通过一次. 额外加入source和sink来控制满流为2. 代码都雷同,以HDU3376为例. #include <algorithm> #include <iostream> #include <cstring>…
Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3408   Accepted: 1513 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must…