02 2012 档案
摘要:枚举 poj1753 (位运算+BFS)√poj2965(同上)√贪心Poj1328 √ 水,poj2109√雷人poj2586√枚举五种情况分治法poj2524√很裸的并查集递推poj2506√大数f[n] = f[n-1] + 2*f[n-2]构造法Poj3295√ 给出前缀式,判是否是重言式。枚举共32种情况模拟法poj1068 (用0表示,)用1表示,把括号的情况模拟出来,然后再统计。√poj2632 插!这题 DBL!if..else..,无穷尽也。。。贴下代码吧 √poj1573, 简单模拟 √poj2993, √poj2996 两题类似,2993处理...
阅读全文
摘要:两个典型的例题:POJ 1753, POJ 2965;POJ 1753 状态转移:1 int Flip(int pos, int i) {2 pos ^= (1<<i);3 if(i+4 < 16) pos ^= (1<<(i+4));4 if(i-4 >= 0) pos ^= (1<<(i-4));5 if(i%4+1<4) pos ^= (1<<(i+1));6 if(i%4-1>=0) pos ^= (1<<(i-1));7 return pos;8 }POJ 2965 状态转移:(这题的输出结果是不是要
阅读全文
摘要:最大匹配:1274 √,2239 √,2584(二分图多重匹配) √,2536 √,2446 √最小点覆盖(König定理,最小点覆盖数=最大匹配数):3041 √,1325 √,2226 √(构图有点难度),最小边覆盖:2724(构图比较难),3020最大独立集(总点数-最大匹配):1466,3692有向图最小路径覆盖:2060,1422,3216,2594(+传递闭包),1548(和3636类似,可以用Dilworth定理转化为LIS问题,也可以用匹配),最优匹配(KM算法):3565,2195转载:http://hi.baidu.com/lewutian/blog/item/f
阅读全文
摘要:前段时间看了一点网络流,可惜每写总结。也每复习,所以今天拿过来再看照样抓瞎。。。这里好好谢谢总结。几个基本概念: 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...
阅读全文
摘要:1、网络流 给定一个二分图G = (X, E, Y)。构造与G对应的网络G‘, 构造方法如下:(1)增加一个源点s, 一个汇点t 。(2)从s向X的每个顶点引一条有向边,从Y的每个顶点向t引一条有向边。(3)将原图G的每一条边改为从X指向Y的有向边。(4)让所有的边容量为1 。然后求最大流,就是二分图的最大匹配边数。 2、匈牙利算法 首先定义增广路:若P是图G种一条联通两个未匹配定点的路径,并且属于M的边和不属于M的边(已匹配的边和未匹配的边)在P上交替出现,则称P为相对于M的一条增广路。特别地,当一边(v, v')两端点均为非M-顶点,通路(v, v')亦称为增广路。算法具体
阅读全文
摘要:二分图: 二分图G指的是一种图,其所有的定点分成两个集合X 和 Y,其中X或Y在各自集合种的任意两个点都不相连,而分别在X 和Y 种的两个定点可以构成边。如图 X = {1, 2, 3} Y = {4, 5, 6, 7}图可以表示为 G = (V, E), 其中 V = Xυ Y。 匹配: 二分图G的匹配M 是指边集合E的子集M, 具有性质:M中没有两条边有公共定点。显然,如果M是一个匹配,则X种的每一个定点至多与M的一条边关联,类似的,Y种每一个定点至多与M的一条边关联。 最大匹配:在G的所有匹配种具有最多边数的匹配; 完美匹配:如果所有的点都在匹配边上,称这个最大匹配是完...
阅读全文
摘要:POJ3207 - Ikki's Story IV - Panda's Trickhttp://acm.pku.edu.cn/JudgeOnline/problem?id=3207POJ 3678 - Katu Puzzlehttp://acm.pku.edu.cn/JudgeOnline/problem?id=3678POJ 2723 - Get Luffy Outhttp://acm.pku.edu.cn/JudgeOnline/problem?id=2723POJ 3683 - Priest John's Busiest Dayhttp://acm.pku.edu
阅读全文
摘要:2-SAT水题,还wa了好几次,可见本菜更水。。。课件上都有讲解。。。渣代码:View Code #include <iostream>#include <cstring>#include <cstdio>#include <stack>using namespace std;const int N = 2012;const int M = 1000000;struct node { int to; int next;} g[M];int head[N], scc[N];int dfn[N], low[N];int t, ind, cnt;boo
阅读全文
摘要:重点是怎么建图,纠结了一天看2-SAT的资料...a 表示1, a'表示0,则:1、a and b = 1, a' -> a, b'-> b (a b 同时为1 )2、a and b = 0, a -> b', b -> a' (a b 不同时为1)3、a or b = 1, a' -> b, b' -> a (a b不同时为0)4、a or b = 0, a -> a', b -> b' (a b同时为0 同1)5、a xor b = 1, a -> b',
阅读全文
摘要:今天突然找到一道2-SAT的题,然后开始找各种资料,课件,最后还是看得云里雾里的。。。2-SAT算法解题过程:1.构图2.求图的极大强连通子图3.把每个子图收缩成单个节点,根据原图关系构造一个有向无环图4.判断是否有解,无解则输出(退出)5.对新图进行拓扑排序6.自底向上进行选择、删除7.输出今天(2/15)wy大牛给我解释是:其实就是把和取/析取式 变成蕴含式。话说偶的离散数学没学好,回头翻书去~~~
阅读全文
摘要:题意,给出每个儿子喜欢的mm的编号,然后再给一个原定的配对序列,求出每个儿子可以泡的mm,并保证每个儿子都有mm泡。 思路:看得大牛的思路,比如儿子u喜欢mm v,则u -> v建一条边。给出的配对序列中,儿子u要泡v则 v -> u建一条边。然后得到一个有向图,然后求出强连通分量。就ok啦ps:1wa没有初始化,2wa结果没有排序输出。。。一个国王搞出2000个儿子,Orz~~渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #inclu
阅读全文
摘要:题意:添加一定数目的边,构成无向双连通图 方法:一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图。把每个双连通子图收缩为一个顶点,再把桥边加回来,最后的这个图一定是一棵树,边连通度为1。统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf。则至少在树上添加(leaf+1)/2条边,就能使树达到边二连通,所以至少添加的边数就是(leaf+1)/2。具体方法为,首先把两个最近公共祖先最远的两个叶节点之间连接一条边,这样可以把这两个点到祖先的路径上所有点收缩到一起,因为一个形成的环一定是双连通的。然后再找两个...
阅读全文
摘要:题意:求割点,并求出割点删掉后剩下的连通块数渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N = 1005; 8 const int M = 100000; 9 const int inf = ~0u>>2;10 11 struct node {12 int to;13 int next;14 } g[M];15 16 int head[N], cut[N];17
阅读全文
摘要:题意:求一个图中删掉一个结点所得到的连通块数量最大。 思路:设一个结点u,如果u是根结点(图可能是不连通的,所以可能有多个根结点)则删掉u所增加的连通块数为 SUM(u的子结点) - 1;如果u是非根结点,v是u的子结点,则删掉u所增加的连通块数为 SUM(u->v为割边, 既u是到v的割点);渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <stack> 5 6 using namespace std; 7 8
阅读全文
摘要:求出强连通分量,缩点。得到新图DAG, 求DAG中max(入度为0的点数,出度为0的点数);渣代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 6 using namespace std; 7 8 const int N = 20010; 9 const int M = 50010; 10 11 struct node { 12 int to; 13 node* next; 14 } *first[M];
阅读全文
摘要:题目描述很吓人。。。题意就是求出强连通分量,然后缩点得到DAG, 求DAG中出度为0的缩点,并输出缩点包含的集合(可能有多个这样的缩点)渣代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int N = 5010; 10 const int M = 51000; 11 12 stru
阅读全文
摘要:将强连通分量进行缩点,然后找缩点后的图中出度为0的缩点所包含的结点数,就是最后结果。如果出现多个出度为0的缩点,则表示不存在所求的点。渣代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 6 using namespace std; 7 8 const int M = 50010; 9 const int N = 10010;10 11 struct node {12 int to;13 int next;
阅读全文
摘要:Tarjan 它好贱,wa了10+次。。。 思路:用“它贱”进行强连通缩点。然后统计缩点后的图中入度为0的点的个数in和出度为0的点到个数out。A就是in, B就是max(in, out);渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <stack> 5 6 using namespace std; 7 8 const int N = 110; 9 10 struct node {11 int to;12 int n
阅读全文
摘要:转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html基本概念:1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。3.点连通度:最小割点集合中的顶点数。4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图。5.割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。6.边连通度:一个图
阅读全文
摘要:转载自:http://www.byvoid.com/blog/scc-tarjan/zh-hans/[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是
阅读全文