摘要:
1 /* 2 构建一棵dfs树,序列dfn[i]为深度优先数,表示dfs时访问i节点的序号,low[i]表示从i节点出发能访问到的最小的深度优先数。 3 4 当且仅当节点u满足如下两个条件之一时,u为割点: 5 1.u为dfs树的根,且u至少有两个子节点。 6 2.u不是dfs树的根,至少存在一个节点v是u的子节点,且low[v]>=dfn[u]。 7 8 若u为割点,记subnets[u]为u的子节点数,则去掉u后,图被分成subnets[u]+1个部分(每个子节点的部分和u的祖先的部分),若u为dfs树的根,则分成subnets[u]个部分(根节点没有祖先)。 9 ... 阅读全文
摘要:
构图参考:http://www.cppblog.com/abilitytao/archive/2010/03/30/111042.html 1 // File Name: 3680.cpp 2 // Author: Missa 3 // Created Time: 2013/4/19 星期五 15:57:48 4 5 #include<iostream> 6 #include<cstdio> 7 #include<cstring> 8 #include<algorithm> 9 #include<cmath> 10 #include& 阅读全文
摘要:
在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、分配经过路径的流量,可以达到所用的费用最小的要求。如n辆卡车要运送物品,从A地到B地。由于每条路段都有不同的路费要缴纳,每条路能容纳的车的数量有限制,最小费用最大流问题指如何分配卡车的出发路径可以达到费用最低,物品又能全部送到。 1 //最小费用最大流模版.求最大费用最大流建图时把费用取负即可。 2 //无向边转换成有向边时需要拆分成两条有向边。即两次加边。 3 const int maxn = 1010; 4 const int maxm = 1000200; 5 const i 阅读全文
摘要:
http://www.cppblog.com/MatoNo1/archive/2011/04/05/143449.html图的连通度问题是指:在图中删去部分元素(点或边),使得图中指定的两个点s和t不连通(不存在从s到t的路径),求至少要删去几个元素。图的连通度分为点连通度和边连通度:(1)点连通度:只许删点,求至少要删掉几个点(当然,s和t不能删去,这里保证原图中至少有三个点);(2)边连通度:只许删边,求至少要删掉几条边。并且,有向图和无向图的连通度求法不同,因此还要分开考虑(对于混合图,只需将其中所有的无向边按照无向图的办法处理、有向边按照有向图的办法处理即可)。【1】有向图的边连通度: 阅读全文
摘要:
无向图点连通度:构造有向图,再枚举源汇点求最小割。1、无向图中任一个点u拆边为u和u+N,连容量为1的有向边。2、对于无向图中原有的任意无向边(u,v),在构造的有向图中添加边(u+N,v)和(v+N,v),容量均为无穷。(拆边规则)3、O(n^2)枚举源点(拆后出点)、汇点(拆后入点)求最小割的最小值(注意源点与汇点直接相连的情况,显然此时最大流流出来的是inf)。View Code 1 // File Name: 1966.cpp 2 // Author: Missa 3 // Created Time: 2013/4/19 星期五 10:29:17 4 5 #include... 阅读全文
摘要:
告诉了一个有向图G(V,E)、源点S、汇点T。假设这个网络图的最大流是mflow。那么请问,一共有多少条这样的边:仅仅增加此条边的容量上限,可以使得mflow变大,输出这些边分别是什么。先跑一遍最大流得到残留网络。从st深搜残留网络中所有未满流的边,把能到达的点标记。从en做同样的事。显然对于一条满足题意的边必有u在st能到达。v在en能到达。枚举所有边即可。 1 // File Name: 3204.cpp 2 // Author: Missa 3 // Created Time: 2013/4/18 星期四 22:48:07 4 5 #include<iostream> 6 . 阅读全文
摘要:
N个人,告诉一系列谁有谁的联系方式。 问题:指定S,T两个人,问除这两个人以外,最少踢掉几个人,可以使得这两个人无法联系的上。给出字典序最小的一种方案。拆点。因为题目要求的是剔除多少个点。我们要把他转换成剔除多少条边。所以要拆点。枚举删除每一条边,其余边与原图一致,判断新图的最小割是否比原图减少。减少说明是割集的边。 1 // File Name: 1815.cpp 2 // Author: Missa 3 // Created Time: 2013/4/18 星期四 19:31:30 4 5 #include<iostream> 6 #include<cstdio> 阅读全文
摘要:
题意就是 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少那么本题的话,我们看到是要删除所有的边,但只需要在两个端点中的一端进行删除即可,这就可以联想到了最小点权覆盖了。一般对有向图而言,我们经常进行的就是拆点,将每个点拆成两个点,一个点是代表边从这出来,一个代表边从这进去。就分别对应了两种操作了。然后按照最小点权覆盖模型进行建图,求最大流。残余网络中从超级源开始深搜所有可达点。{A}中不可达的点就是应该执行1操作的点。 残余网络中,左侧不可达的点表示被操作1的流选中了{B}中可达的点 阅读全文
摘要:
题意:一个矩阵,有的方格里有一些敌人,每行或每列都可以安放一架枪,每架枪都有一个花费,而且能消灭他所在的行或列的所有敌人,最后的花费为所有的枪花费的乘积。乘积问题可以先取对数。转化成求和。然后问题很像以前的一个二分匹配问题。把每一行加入到X集合。每一列加入到Y集合。则每一个外星人所在的(row,col)就连条边。求最小点覆盖。但是这个问题有权值。可以转化成KM或者最小割来求解。最小割建图:src 与每一行相连,权值为每行的花费。en 与每一列相连,权值为每列花费。假如外星人出现在(r,c)则连一条r -->c权值为inf的边。 1 // File Name: 3308.cpp 2 // 阅读全文
摘要:
无向图中给出N个点,M条边,每个点有当前囤积流量和最大容量,任意两个点之间有距离,首先保证所有的流量都可以被节点吸收(即不超过最大容量),然后将流量跑的最大距离限制到最小。拆点:然后二分答案。跟poj 2112差不多。View Code 1 // File Name: 2391.cpp 2 // Author: Missa 3 // Created Time: 2013/4/17 星期三 0:02:23 4 5 #include<iostream> 6 #include<cstdio> 7 #include<cstring> 8 #include<al 阅读全文
摘要:
题意:K个产奶机,C头奶牛,每个产奶机最多可供M头奶牛使用;并告诉了产奶机、奶牛之间的两两距离Dij(0<=i,j<K+C)。问题:如何安排使得在任何一头奶牛都有自己产奶机的条件下,奶牛到产奶机的最远距离最短?最短是多少?二分答案。注意先floyd求得两两之间最小距离,二分的时候上界不是200。200只是直接相连的最大距离。 1 // File Name: 2112.cpp 2 // Author: Missa 3 // Created Time: 2013/4/11 星期四 14:20:52 4 5 #include<iostream> 6 #include<c 阅读全文
摘要:
最小度限制生成树就是给一个图,让求它的最小生成树。找的的最小生成树满足并且点vo的度最大为k。算法流程如下:1.将该点(以下用v0表示)从图中删除,将得到p个连通分量。2.对每个连通分量求最小生成树。3.从每个连通分量中找与v0关联的权值最小的边,与v0相连接,这样将得到v0的最小p度生成树4.如果k<p那么这种树是不存在的。5.如果k>=p,那么考虑构建p+1度最小生成树,即加入每一条与v0相连的且不在当前的树中的边。6.显然在第5步将其加入树中,必然会存在一个环,那么删掉该环中与v0不关联的权值最大边,将得到加入该边后的最小生成树,且v0是p+1度的。7.枚举上述5,6的边找树 阅读全文
摘要:
http://acm.cs.ecnu.edu.cn/problem.php?problemid=1468解题报告:http://www.cnblogs.com/blackcruiser/articles/1997097.htmlView Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<stack> 阅读全文
摘要:
求次短路。 1 // File Name: 3255.cpp 2 // Author: Missa 3 // Created Time: 2013/4/5 星期五 1:01:09 4 5 #include<iostream> 6 #include<cstdio> 7 #include<cstring> 8 #include<algorithm> 9 #include<cmath>10 #include<queue>11 #include<stack>12 #include<string>13 #in 阅读全文
摘要:
题意:1天24小时,每个小时需要售货员人r[i]个(r[1]表示从0:00-1:00,,等等),n个工人应聘,每个人开始工作时间为st[i],都工作8个小时。问最少的应聘人数。分析:为了防止出现负数,在这里把标号设为1-24,并且设0为虚点。设x[i]是实际雇用的i时刻开始工作的员工数,r[i]是题目需要的i时刻正在工作的最少员工数.设s[i]=x[1]+x[2]+……+x[i],s[0]=0.则s[i]表示1-i这段时间开始工作的员工数再设t[i]表示i时刻开始工作的最多可以雇用的员工数∴有0<=x[i]<=t[i]即0<=s[i]-s[i-1]<=t[i]由于是求最 阅读全文