随笔分类 - 图论——网络流
摘要:周冬的《两极相通——浅析最大最小定理在信息学竞赛中的应用》把方法讲的很详细了。几点:1、把平面图G*中每一个面抽象成对偶图G*中的点。2、平面图包含f个面,设边e分割fi, fj,则连边(fi, fj)。3、关于如何区分源点和汇点。可以先连接s和t,得到一个附加面。如下图s->4->7->t->s,s*放到附加面中,t*放到无边界的面中,加以区分。4、建好图后要把(s*, t*)这条边删掉。5、G的面数等于G*的点数,G*的点数等于G的面数6、G与G*边数相同 G*中的环对应G中的割一一对应如图:hdu 3780题意是求最小割。直接套网络流模板会TLE。转换成最短路模型
阅读全文
摘要:很明显的费用流,不过建图还是卡住了。。。问的gb才知道怎么建图。。。先是源点到n个串,容量是a[i],费用是0,然后是串t中包含的所有不重复字母为一个节点,从这些节点向汇点T连边,容量是当前字母的个数,费用是0。然后是n个串向T中的字母连边,容量是a[i]中当前字母的个数,费用是i。ps:费用流模板有问题。以至于debug了好久。。。T_TView Code //#pragma comment(linker,"/STACK:327680000,327680000")#include <iostream>#include <cstdio>#includ
阅读全文
摘要:胡伯涛的《最小割模想在信息学竞赛中的应用》中讲到了最大密集子图。而这题是一个很裸的最大密集子图。。。定义:无向图G中存在一个子图G‘,使得G‘中|E|/|V|最大。即:分数规划,设一个猜想值g,构造一个新函数h(g) = max{sigma(Xe) - sigma(g*Xv)} (Xe属于边集,Xv属于点集)有:已知:乘以-1得:乘以2化简得:其中C[V', !V']表示的图的最小割。所以可以根据如下方式建图:dv最大为m,所以U = m即可, 1/n <= g <= m/1;同时有一个结论:任意两个密集子图,他们的密度查不小与1/n2另外(摘自Discuss):这
阅读全文
摘要:在这里学会的最小费用最大流问题。定义:图G以S为源点,T为汇点。c(i, j)为G的容量,f(i, j)为G的流,w(i, j)为单位流量的费用且w(i, j) = -w(j, i)。费用wf = ∑(fij * wij) (i, j)∈E(G)。就是求最大流F的情况下保证wf最小。 思想:利用Ford-Fulkerson算法的思想,不断的在残留网络中找增广路,这里找的增广路是当前网络从S到T的以单位流量为权值的最短了。因为涉及道负权,所以可以选择spfa或者bellman-ford。实现代码:const int N = 110;const int M = N*N*2;int n, m,...
阅读全文
摘要:图算法差分约束系统的建立和求解poj1201(1716类似),poj2983, poj3159poj1275, poj1364最小(大)费用最大流poj2516, poj2195, poj3422(最大费用最大流)poj2135(很裸的最小费用最大流,不过有一个大坑。。。)双连通分量poj2942,poj3694强连通分支及其缩点poj2186, poj3592, poj3114图的割边和割点poj3352(外加3117)最小割模型poj3308, poj3155(偏难)详见:http://www.cnblogs.com/vongang/archive/2012/10/25/274004...
阅读全文
摘要:前段时间看了一点网络流,可惜每写总结。也每复习,所以今天拿过来再看照样抓瞎。。。这里好好谢谢总结。几个基本概念: 1)、残留网络:一个流网络图G = (V, E)中,在不超过容量c(u, v)的条件下,从节点u到v之间可以再压入的额外的网络流量就是(u,v)的残留容量。cf(u,v) = c(u, v) - f(u, v); (其中f(u, v)为u到v之间可以再压入的额外流量)由这些残留容量最后构成的新的流网络G‘ = (V, E)就是残留网络。说白了就是已经压入一些流量,消耗掉c(u, v)的一部分容量,然后剩下的容量构成的图就是残留网络。如图b) 就是残留网络: 2)、增广路径...
阅读全文
摘要:1、基于Ford-Fulkerson方法的Edmonds-Karp算法 用广度有限搜索来实现对增广路径p 的计算。即,如果增广路径是残留网络种从s 到t 的最短路径,则能够改进Ford-Fulkerson的界。View Code 1 //做一次增广路径的流量统计 2 3 int augment() { 4 int v, i, ans; 5 bool flag = false; 6 deque<int> q; 7 8 memset(vis, 0, sizeof(vis)); 9 memset(pre, -1, sizeof(pre));10 1...
阅读全文
摘要:/*拿到这题确实不知道怎么建图,问师兄,师兄讲了半天我也没听懂,后来看了 Edelweiss大牛的《网络流建模汇总》,第一个就是讲的这道题。大体思路是建立一个很直观的模型,但是复杂度太高,然后根据所找到的规律删边,最后可以得到简单的建图规律:1、从源点S到访问第i个猪圈的第一个人建一条边,容量Ci 就是猪圈里猪的头数,后边如果再有顾客访问第i个猪圈,则从一个访问者到后来访问的顾客建一条边,容量为 +∞ 表示他们之间可以相互联通。2、如果从源点到一名顾客有多条边,则把这些边的合成一条边,容量累加。3、每一个顾客到汇点T建一条边,容量就是顾客要买的猪数。PS:网络流难的不是Dinic,SAP什..
阅读全文
摘要:/*昨晚写把Dinic写错了,一直不出结果,也没调出来,睡觉之前猛然想起来,少了一个break,造成死循环了。今天把那地方改过来,交上去WA。然后又重新敲之,TLE。后来检查了一遍,发现是Floyd写错了,改过后终于过了,发现网络流太容易错了。 思路:1、用Floyd把每个奶牛到每个挤奶机的距离算出来,然后问题就变成了已知c头奶牛到k个挤奶机的距离,求走最远距离的牛走的路程mindis最小是多少。2、然后建网络流模型,每头奶牛和挤奶机都是一个结点。设一个源点s,s到c头奶牛的容量都记为1,k个挤奶机到汇点T的距离都记为m。3、先假设一个mindis的值,然后当奶牛到挤奶机的距离小于min...
阅读全文
摘要:参考郭炜老师课件上的代码。思路是建立一个超级源点和一个超级汇点,先输入的串如果是0000....或02...的形式,则与源点相连,后输入的串如果为1111...则与超级汇点相连。然后拆点,把从入机器前的状态到如机器后的状态看成一个流,流的最大量就是该机器每小时可以加工的元件数。然后用EK的优化——Dinic。思路就是在先用bfs把图中所有的结点标上按遍历的顺序标上层次,这样找到一条增广路径后就不需要退到0号结点,而是推倒所找的增广路径上跟下一个结点的容量是最小容量的那个结点。、Code:#include <iostream>#include <cstring>#incl
阅读全文
摘要:/*很裸的网络流题目,看了两天算导,今天终于A了一道网络流的题目。我的第一道网络流啊。。。^ ^My Code:*/#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int N = 210;const int inf = 0x6fffffff;bool vis[N];int map[N][N];int pre[N];int n, m;int augment() { int v, i, f_min; bool
阅读全文

浙公网安备 33010602011771号