Going Home(MCMF)】的更多相关文章

题目链接:https://uva.onlinejudge.org/external/16/1658.pdf 题意:求1到N的两条路(不能相交),距离和最小. 分析: 第一次做拆点,有点意思.刚开始一直出不了结果,原来是初始化少了一点. 注意的是:我想我的建图方法较刘汝佳的方法有一点小区别,加一个源点S,和汇点T,刘汝佳的方法是把2—v-1拆掉. 然后这里拆点有些技巧.还是阳哥教我的. #include <iostream> #include <stdio.h> #include &…
题目链接:https://uva.onlinejudge.org/external/128/12821.pdf 比赛的时候,准备用最短路来做,存两张图,做两次最短路,本来还觉得第二张图的设计很好的,很不错,结果过了好多案例,还是莫名其妙的WA了. 好吧,问题来了. 6 71 2 1 1002 3 10 1001 4 10 1002 5 1 1003 6 10 1004 5 10 1005 6 1 100 ans = 42, 最短路思路就是不对的. 完了之后,听阳哥说,直接MCMF啊,当时我就傻逼…
题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14821   Accepted: 5657 Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 click here 任意一个变量在两个方程组中且一正一负,根据流量守恒的原理构图.正变量看作流入量,负变量看作流出量,正负常数看作与源汇点的流量. [代码] #include<set> #include<cmath> #include<queue> #include<vec…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3171 [题意] 给定一个方向矩阵,要求改变最少的格子,使得任意一个点都在一个环中. [思路] 任意一个点位于一个环中,即等价于所有的点都有且仅有一个后继. 对于一个点构建X Y结点. 连边(S,Xi,1,0),(Yi,T,1,0).对于原来可以转移到的点连边(Xi,Yj,1,0),对于需要变换才能转移到的连边(Xi,Yk,1,1). 求最小费用最大流.最大流保证了每一个点都会有一个后…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题意] 给定一个有向图,每条边有容量C,扩容费用W,问最大流和使容量增加K的最少扩容费用. [思路] 第一问就是费用为0的费用流 第二问在第一问的残量网络上操作,对于每条边都新加一条容量为inf,且费用为W的边.至于容量增加K,只要新建一个S点向1连一条容量为K费用为0的边即可.然后跑一遍最小费用最大流. [代码] #include<set> #include<cma…
稀疏图慢死了...但是稠密图效果还是很好的 struct MCMF{ struct tedge{int x,y,cap,w,next;}adj[maxm];int ms,fch[maxn]; int vis[maxn],d[maxn],ans,cost,S,T,n; void init(int n){ ;ans=cost=; memset(fch,-,sizeof(fch)); return; } inline void addedge(int u,int v,int cap,int w){ a…
没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms,fch[maxn]; int n,m,d[maxn],p[maxn],a[maxn];bool inq[maxn]; void init(int n){ ; memset(fch,-,sizeof(fch)); return; } void addedge(int u,int v,int z,int…
给你一些区间,每个区间都有些价值.取一个区间就能获得对应的价值,并且一个点不能覆盖超过k次,问你最大的价值是多少. 我们可以把这些区间放到一维的轴上去,然后我们可以把它看成一个需要从左到右的过程,然后这个过程中保证每个点不超过k次,并且获得的价值最大. 因为一个点不超过k次,只需要控制流入的最大流量是k,就可以保证每个点的流量都不会超过k. 建图过程: 1.超源到整个区间最小的点, 流量k, 费用0. 2.整个区间内每个点(除了最后一个点)到自己的下一个点,流量inf,费用0. 3.每个区间的左…
在个给出的矩阵从,从左上角走到右下角,然后再从右下角走到左上角,两次不能经过想同的点,每个点都有一个价值,问最大的价值是多少. 可以把原来的问题化简成从左上角走两条路到右下角,然后把价值加起来,然是这时候我出发点和目标点的价值加了两次,而原本只计算一次,所以最后要减掉,然后建图 1.超源到(1,1), 容量inf,费用0 2.自身拆点,(1, 1)和(n, m)容量2,其他点容量1,费用就是本身的价值的负值 3.(n, m)到超汇,容量inf,费用0 #include<map> #includ…
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2715 Time limit : 5 sec Memory limit : 64 M Zhouguyue is a "驴友" and nowadays he likes traveling on an N * N matrix with a non-negative number in each grid, and each grid has a height. Zhouguyue star…
题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Description 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…
标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #include<queue> #include<algorithm> using namespace std; +; //最大点数 const int INF=0x3f3f3f3f; struct edge{ //边:起点.终点.容量.流量.单位费用 int from,to,c,f,cost; e…
题意:给定一个有向带权图,使得每一个点都在一个环上,而且权之和最小. 分析:每个点在一个环上,入度 = 出度 = 1,拆点入点,出点,s到所有入点全部满载的最小费用MCMF; #include <bits/stdc++.h> using namespace std; *; const int INF = 0x3f3f3f3f; typedef pair<int,int> pii; struct Edge { int from, to, cap, flow, cost; }; str…
题意:两遍最长路,不能走重复点.和UVA 10806类似. 分析:拆点,u->u',MCMF,求的是最大流的最小费用,那么cost取负. 注意的是源点,源点不用拆,那么走出来的最小费用,左上角的点,右下角的点走了两遍,输出除去即可. #include <bits/stdc++.h> using namespace std; +; const int INF = 0x3f3f3f3f; struct Edge { int from, to, cap, flow, cost; }; stru…
注意题目中 边的容量 <= 5.可以把费用权值 a *f ^2化归成 a * f2, 即第一条边费用为 1 * a, 第二条 为 (4 - 1) * a, 第三条为 (9  - 4) * a...... #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; ; ; const int inf = 0x3f3f3f3f;…
题目链接:https://uva.onlinejudge.org/external/108/10806.pdf 题意:无向图,从1到n来回的最短路,不走重复路. 分析:可以考虑为1到n的流量为2时的最小花费: 建图: 一个点到一个点的容量为1,费用为距离. #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <algorithm> #in…
http://poj.org/problem?id=2195 题意:在一个n*m的图中,'m'代表人,'H'代表房子,人每移动一次的费用为1,求所有人移动到房子里的最小花费. 思路:最小费用最大流问题.关键是建图,建好图后就是MCMF的模板题了.. 关于建图:增加一个原点S,一个汇点T, S与所有人相连,容量为1,花费为0:每个人与所有房子相连,容量为1,花费为|人与房子的水平距离|+|人与房子的垂直距离|:最后所有的房子 与汇点相连,容量为1,花费为0. 关于算法:多次spfa找增广路,然后求…
Modular Production Line \[ Time Limit: 1000ms\quad Memory Limit: 65536kB \] 题意 给出 \(N\) 种零件,现在你可以用连续的一些零件组装成为一个产品,组装完你可以获得 \(w\) 的价值,要求每种零件最多使用 \(K\) 次并且每一个产品只能生产一个.问你最多可以获得的价值是多少. 思路 由于给出的 \(N\) 很大, \(M\)很小,那么显然,很多点都是没有用的,那么我们就可以将他们舍弃掉,只使用出现的点,那么可以考…
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls") #include <iostream>//pair #include <fstream>//freopen("C:\\Us…
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1533 相邻的容量为inf,费用为1,S到m容量为1,费用为0 ,H到T容量为1,费用为0. 建图跑-最小费用最大流-就行了. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strc…
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出格式 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用. 输入输出样例 输入 #1 4 5 4 3…
题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖. 思路:首先要理解建图思路,首先有一个基图,相邻点之间都有边,花费为0,容量为 k,然后再根据所给数据 u,v, w 建图,u,v,加一条容量为 1,花费为 - w的边,求最大费用最大流,只需将权值变为负数即可求出最短路,相反数即为最大值. 最小费用最大流,就是用SPFA寻找最短路(增广路容量是否大于流量,花费最短路),然后用最大流方法去计算最大流…
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出格式 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用. 输入输…
Minimum Cost POJ-2516 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式. 对于每个种类的商品k,建立一个超级源点和一个超级汇点.每个商家和源点连线,容量为需要的商品数,每个供货商和汇点连线,容量为可以提供的商品数. 然后对于商家和供货商之间的连线就是,容量为INF,而费用就是题目提供的费用信息. #include<iostream> #include<cstdio> #include<algorithm> #i…
Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1,因为花费等于距离.但是需要增加一个源点和一个汇点,然后将每个人和源点相连,每个房子和汇点相连,容量都为1,费用都为0. #include<iostream> #include<algorithm> #include<cstring> #include<queue>…
食用前请先了解 SPFA + Dinic/EK 求解 MCMF. Sol. 总所周知,SPFA 牺牲了.于是我们寻求一些更稳定的算法求解 MCMF. 网络流算法的时间属于玄学,暂且判定为混乱中的稳定.那么我们就只能考虑在最短路算法上寻求优化.于是就想到了 Dijkstra. 但 Dijkstra 有一个致命的弱点:无法处理负权边.而我们应用的场景显然含有负权. 开动脑筋想一想可以想到一个"给所有边权加上巨大多权值进而规避负权边"的方法. 但这样在实现中,还需要记录一条最短路目前经过了哪…
题目链接 题意:给定一个n*n的矩阵,找一条路,从左上角到右下角再到左上角,每个点最多经过一次,求路径上的点的权值的最大和. 将矩阵中每个点拆点,点容量为1,费用为点权值的相反数.每个点向自己右侧和下侧的点连一条容量为1,费用为0的边.左上角为起点,右下角为终点,对起点终点分别额外加条容量为1,费用为0的边,然后跑最大流最小费用.输出费用的相反数即可. #include<bits/stdc++.h> using namespace std; ; ; const int INF=0x3f3f3f…
题意: 费用流,其实bushi 给你长为\(n\)的序列\(a\),\(b\).\(a\)单增,\(b\)有正有负. \(q\)次询问\([l,r]\),保证\(\sum\limits_{i=l}^rb_i=0\),将区间\([l,r]\)中每个值当节点,\(b_i<0\)的连S,\(b_i>0\)的连T,容量为\(abs(b_i)\).两两点连边,容量为inf,费用为\(abs(a_i-a_j)\).问最小费用最大流. 思路: 显然有一个感性的贪心思路:每次尽量会去抵消前面最近的需要抵消的流…
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2051  Solved: 1263[Submit][Status][Discuss] Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一.赛车大赛的赛场由N颗行星和M条双向星际航路构成,其中每颗行星都有一个不同的引力值.大赛要求车手们从一颗与这N颗行…