
ACM_图论
文章平均质量分 78
逍遥丶綦
这个作者很懒,什么都没留下…
展开
-
Fleury算法 hihoCoder1181 欧拉路·二
Fleury算法用来求欧拉回路的路径,其实就是一种DFS如果并不能完全到达,那么得到的r就不会等于m,就说明欧拉回路不存在#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int mod=1e9+7;const原创 2015-06-29 18:42:58 · 840 阅读 · 0 评论 -
BFS Codeforces591E Three States
传送门:点击打开链接题意:在表格中,有3种site,每种site都是连通的,现在想让3种site连通,要在空地修路,求修最小的路使得3种site都连通。思路:对于3种site,都求一遍BFS,记录每个点到每种site的最短距离。途中顺便维护每种site之间的最短距离那么最后答案会有2种情况,第一种情况是修的路是经过一个site的,这个只有3种情况,都讨论一下还有一种情况是,一个原创 2015-11-02 23:25:26 · 1143 阅读 · 0 评论 -
最小路径树 Codeforces545E Paths and Trees
传送门:点击打开链接题意:告诉你图,和起点,求一棵树,使得起点走树上的路径到达其他的节点的路径是原来图中的最短的,且要求起点到所有点的距离之和最短。思路:其实就是dijkstra的思路,只不过要稍微注意几个东西,首先是要保存上一条边的id,然后就是要注意当dist相同时,两条路径的长度相等时,应该要考虑最后一条边的长度,应该要选长度小的,因为两种方法实际上都是最短的,但是如果选边短的,就说原创 2016-01-02 23:07:54 · 910 阅读 · 0 评论 -
LCA+最小生成树 Codeforces609E Minimum spanning tree for each edge
传送门:点击打开链接题意:给一个图,有m条边n个点,如果对于一个最小生成树中要求必须包括第i条边,那么最小生成树的权值总和最小是多少思路:求出最小生成树,然后对于m条边相当于m次查询,每次查询的时候,相当于求出在最小生成树中(u,v)路径上的边权最大值,那么新添加了一条边,就要把这条最大值的边删掉。所以题目转换成了,求路径上边权最大值。可以用LCA来做,也可以用树链剖分来维护。原创 2015-12-20 20:45:43 · 1465 阅读 · 0 评论 -
异或前缀和+DFS hdu5416 CRB and Tree
传送门:点击打开链接题意:给你一棵树,然后Q个问题,每个问题询问有存在多少个f(u,v)等于s其中u思路:这道题我觉得出的非常好,运用了位异或的一些妙用。f(u,v)=f(1,u)^f(1,v),因为假设u,v的lca是p,那么1~p这些节点都是公用的,这部分被异或了两次,就抵消了然后对于Q次问题,假设某一次问题是s,则有s=f(u,v)=f(1,u)^f(1,v)。那么有f(1,v)原创 2015-08-22 14:26:55 · 1746 阅读 · 0 评论 -
DFS Codeforces505D Mr. Kitayuta's Technology
传送门:点击打开链接题意:告诉你n个点,和m条关系,每个关系有u和v,要求u能通过有向边到达v,问要完成这个有向图至少需要多少条边。思路:就是个xjb的贪心....首先,我们把边按无向图处理,把图分成很多个分块。对于每个分块,如果这个分块里存在环,那么说明边数>=节点数对于一个分块,假如我把这些点首尾相连,此时是完美的!因为现在我用了最少的边数,使得可以从一个点到任意一个点,那么无原创 2016-01-11 22:23:53 · 1327 阅读 · 0 评论 -
点分治 nbut1654 Ancient battle tree
传送门:点击打开链接题意:一棵树,求点对数,满足两点之间的最短距离等于树的最长链长。思路:比较蠢,只想到点分治。先用DFS求出树的最长链,然后跑点分治,这题很类似楼教主的男人八题的那题,不过那个更复杂些。还有一个trick,就是如果n=1,只有1个点,那么最长链长等于0,满足的题意的点对有(0,0),所以应该输出1,这里需要特判一下#include#include#incl原创 2016-02-12 17:24:54 · 710 阅读 · 0 评论 -
树型dp Codeforces633F The Chocolate Spree
传送门:点击打开链接题意:给你一棵树,有点权,求两条不相交的路径的点权和的最大值思路:Tourist太神辣,这个代码看他的才学会的,但是他只用了10分钟敲了140行..Orz先一次DFS求出,对于所有的点u,经过这个u点到叶子的路径点权和最大值记为down[u],以及u的子树中一条路径点权和最大值记为best[u]然后用队列来处理,其实也可以用DFS来处理,那么数组就不能用全局变量原创 2016-03-02 11:19:46 · 1645 阅读 · 0 评论 -
强连通分量 CCF201509-4 高速公路
传送门:点击打开链接题意:告诉有向图,求互通的城市对数。思路:强连通分量裸题,求出所有的强连通分量,答案就等于sigma s[i]*(s[i]-1)/2,s[i]是每个强连通分量的大小#include #include #include #include #include #include #include #include #include #include #i原创 2016-03-21 21:51:31 · 2207 阅读 · 0 评论 -
图型dp csu1700 Black Company
传送门:点击打开链接题意:有n个人,每个人都有学历。然后m个关系,每个关系有u和v,表示u和v是朋友现在要求,如果是u和v是朋友,那么学历高的人的工资就必须比学历低的人的工资高如果u和v都是x的朋友,那么对于u和v,那么学历高的人的工资就必须比学历低的人的工资高说白了就是,通过1条边或者2条边相连的点之间,学历高的工资要更高问这样去安排工资,那么总工资最低是多少。思路:因为原创 2016-03-14 00:12:29 · 1472 阅读 · 2 评论 -
DFS+dp 51Nod1448 等幂映射
传送门:点击打开链接题意:等幂映射是这样定义的,对于一个映射 g : {1,2,...,n} → {1,2,...,n} ,对于所有的 x∈ {1,2,...,n} , g(g(x))=g(x)始终成立。 f(k)(x) 表示将映射f作用于x上k次的结果。一般的, f(1)(x) = f(x), f(k)(x) = f(f(k−1)(x)) 对于所有的k>1成立。现在给定一个映射 f原创 2016-04-08 14:04:34 · 456 阅读 · 0 评论 -
强连通分量+缩点 codeforces652E Pursuit For Artifacts
传送门:点击打开链接题意:告诉你一个带权边无向图,边的权值只有0和1,告诉你起点和终点,问是否能使得从起点出发到终点时,路径边权和不等于0,每边最多只允许通过一次。思路:因为"边不能走重复的",往往不能走重复边都可以和强连通分量结合起来。这题我们首先求无向图所有的强连通分量并缩点,对于每一个强连通分量,如果里面有一条边的权值为1,那么最后缩成的点我们也给一个权值1。缩点全部完成后,原创 2016-03-28 17:12:09 · 1146 阅读 · 0 评论 -
01染色 codeforces663C Graph Coloring
传送门:点击打开链接题意:一个无向图中,每条边可能是0或者1。有一种对节点u的操作,操作时把节点u连接的所有边的权值0变1,1变0.现在要把所有边的权值边成相等的,问最少的操作步数,并打印方案。思路:如果确定最后边的颜色了,并对所有的连通块中,确定了一个节点的颜色,那么整个连通块的操作节点就是唯一确定的了。打印方案比较麻烦,,慢慢debug。。#include #include原创 2016-04-24 01:16:15 · 1035 阅读 · 0 评论 -
scu图论专题题解
传送门:点击打开链接感觉做着还是好费劲啊,,,有些东西总是想不到T^TA题:给出边,分别判断是有向图或者无向图的时候,是否为欧拉回路首先必须弱连通图要连通。对于无向图,度全为偶数,或者度为奇数的点的个数为2对于有向图,入度全部等于出度,或者1个点入度-出度=1,1个点出度-入度=1,其他点入度等于出度#include #include #include #in原创 2016-06-03 00:11:30 · 796 阅读 · 1 评论 -
KM hdu2255 奔小康赚大钱
传送门:点击打开链接题意:最裸的带权二分图匹配。思路:KM算法,复杂度为O(n^3),比费用流的效率要快一些,所以有时候必须用KM算法。但是KM算法的适用范围比较小,要学会去分辨.#include #include #include #include #include #include #include #include #include #include #i原创 2016-06-03 15:35:47 · 606 阅读 · 0 评论 -
枚举+求桥 Codeforces701F Break Up
传送门:点击打开链接题意:最多删掉2条边,使得无向图中s到t不连通。点数思路:我们先求一条s到t的任意路径。我们很容易就能证明,如果存在这样的2条边,或者说只需要删一条边就能让他们两个不连通,那么必然是在s到t的一条路径上。所以,我们首先求出任意一条s到t的路径。然后枚举这条路径上的边,最多也只有n-1条。枚举完后,把这条边删了,求桥,而且这个桥必须要满足,S和T分别在桥的原创 2016-07-23 19:51:56 · 801 阅读 · 0 评论 -
拓扑排序 hdu4324 Triangle LOVE
传送门:点击打开链接题意:每两个点之间必有且仅有一条有向边,问是否存在一个3元环。思路:这题与普通的求环有2个不一样的地方,一个是每两个点必有一条边,一个是只是求3元环而已。。然而我们可以证明,如果每两个点之间必有一条边存在环,那么必然会存在3元环。假设某一个n元环上存在a->b->c->d这样的4个,如果d就是a,那么(a,b,c)就直接构成了3元环之间满足题意。如果d不是a,那么就必有原创 2015-10-13 11:32:57 · 887 阅读 · 0 评论 -
有向图欧拉回路 hihoCoder1182 欧拉路·三
终于把欧拉回路的3个例题做完了,没想到竟然可以这样建图避开求曼哈顿回路。把数字当成边,而不是点。这样只需要求一次欧拉回路(相当于所有的数字都用上),就能轻松解决问题了!#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int原创 2015-06-30 19:46:41 · 1378 阅读 · 0 评论 -
拓扑排序 Codecorces510C Fox And Names
传送门:点击打开链接题意:确定一种字典序,使得给出的单词是按照新的字典序排序好的思路:枚举相邻的字符串,然后开始比较两个字符串,确定一个字符的字典序应该小于另一个字符,那么这两个相邻的字符串就满足字典序的顺序,构造出所有需要满足的字符的前后顺序,然后做一遍拓扑排序,答案就出来了wa点:如果用邻接矩阵存边的时候,应该要注意重边,重边的时候不需要更新v的入度。还有,如果遇到两个字符串如xy原创 2015-10-09 20:26:50 · 758 阅读 · 0 评论 -
有向图欧拉回路 Codeforces508D Tanya and Password
欧拉回路图上瘾中,总结下用法对于必须要用上某个单词,就取这个单词的左部分为L,右部分为R,形成一个从L到R的有向图然后再判断是否符合欧拉回路图,即验证所有点的出度和入度,验证方法如下:1.如果所有的点的入度都等于本身的出度,则满足欧拉回路#include#include#include#include#include#include#pragma com原创 2015-06-30 21:47:55 · 1103 阅读 · 0 评论 -
拓扑排序 hihoCoder1175 拓扑排序·二
按照拓扑排序的顺序去扩展病毒数量,这样相当于所有节点只走了一遍就出了结果#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int mod=142857;const int MX=100000+5;const原创 2015-07-01 20:13:37 · 1175 阅读 · 0 评论 -
拓扑排序 hdu1811 Rank of Tetris
这题有3个方面值得深思1.=的处理,读入的时候就先考虑=的,用并查集合并,把第二个节点完全用第一个节点代替,后面建图的时候都使用的是并查集的根节点即可2.判断是否是唯一确定的,就看队列中的size是否永远=2,则说明同时有两个点的入度为0,就不能唯一确定3.判断是否有冲突,先记录并查集后,有多少个连通块,记为sum,然后再判断队列中一共运行了多少个点,记为cnt,若cnt等于sum,那原创 2015-07-02 16:05:29 · 808 阅读 · 0 评论 -
拓扑排序+优先队列 hdu4857 逃生
这题相对于其他的拓扑排序,有了顺序的限制问题,总结了两种限制问题这道题的限制是1能在前就尽量靠前,在1靠前的基础上,2能靠前也尽量靠前刚开始我想当然的以为就是按字典序的意思,后来发现我错了,看个例子14 24 13 2如果按照字典序排序,那么答案应该是3 2 4 1但是,如果按照题目真正的意思,答案应该是4 1 3 2因为这样1更靠前 所以,原创 2015-07-02 12:54:08 · 828 阅读 · 0 评论 -
拓扑排序 hihoCcoder1174 拓扑排序·一
最基础的拓扑排序题了,。,原创 2015-07-01 19:47:15 · 842 阅读 · 0 评论 -
分治法或拓扑排序 poj1463 Strategic game
刚开始以为是覆盖点,,,后来才发现原来是覆盖边,,汗,错了这么多次我写了两种方法,,其实还可以用二分图匹配写的,,就没写了第一种方法是分治法,,具体是这样的我们设计一个函数,能求出当i为根节点时候的子树中,i放士兵时,整个子树士兵最小数量,以及i不放士兵时,整个子树士兵最小数量那么通过求子树的答案,然后把答案合并到根节点呢设根节点放士兵的最小数量为a,不放士兵的最小数量原创 2015-07-27 11:02:54 · 1008 阅读 · 0 评论 -
最短路+tarjan codeforces567E President and Roads
这题出的非常有意义。题意:告诉点一个有向图,和起点s终点t。保证s能到达t。然后询问所有的边如果这条边是s到t的最短路中不能缺少的,就输出YES否则,可以将这条边的长度减小,但是最多中i能减小到1。此时最短路如果必经这条边就输出CAN 减少的长度否则,就输出NO思路:先从s出发做一次最短路,保存在d1数组中。然后把边全部反转,从t出发做一次最短路,保存在d2数组原创 2015-08-08 17:00:50 · 1300 阅读 · 0 评论 -
分治 hihoCoder1050 树中的最长路
这个模型非常的重要,同样也是非常的经典设solve(u)返回的是以u为根节点的子树中的最长链对于以u为根节点的子树,假如有n个子节点v那么,先求出所有子节点的最长链,答案是什么呢?当然是子节点的最长链+次长链!更新一下答案然后再返回最长链,函数就ok了所以随便确定一个根节点建树,然后求出分治求出所有的子树,再合并出答案,这题就差不多做完了~要注意原创 2015-07-24 12:27:20 · 1098 阅读 · 0 评论 -
tarjan求割顶和桥 hihoCoder1183 连通性一·割边与割点
终于把tarjan算法理解了整个tarjan算法有两个非常重要的数组,一个是Low一个是DFNDFN数组是个时间戳,说白了就是访问那个节点的时间,也就是第几次调用DFS这个函数Low是u的子节点能通过反向边到达的节点DFN的最小值,初始值为DFN[u]那么如何判断是否是割顶和割边呢对于上面这个建图,假如我们最开始的根节点是1,然后会得到这样的数组原创 2015-07-24 21:08:21 · 1512 阅读 · 0 评论 -
桥 Gym100712H Bridges
这道题算是一个很综合的题目了题意:已保证给的图是连通图,现在允许你在图中加一条边,使图中的桥的数量最小思路:首先我们可以去想,桥,如果拆了就会增加一个连通分量。换句话说,桥把整个图分成很多个岛屿一样。那么,我们能不能把这些岛屿压缩成一个点?那么现在整个图里面就只有一些点,这些点中间的边都是桥那么问题来了,这个图会有什么特点?这个图应该是一棵树!因为里面不可能有环。如果存原创 2015-07-25 11:04:12 · 944 阅读 · 0 评论 -
DFS nbut1218 You are my brother
传送门:点击打开链接题意:告诉你n个关系,关系(u,v)表示v是u的父亲,现在A是节点1,B是节点2,问A和B的辈分关系思路:这肯定是树型结构,先建立(u,v)的有向边,找到A的祖先root,然后再从root出发看A和B的深度是多少然后比较A和B的深度。trick:A和B可能并不是一个祖先,也就是说A和B可能没有血缘关系,给出的数据并不是一棵树,而是森林,此时应该输出You are原创 2015-08-21 23:01:03 · 821 阅读 · 0 评论 -
删边+DFS hdu5438 Ponds
传送门:点击打开链接题意:有p个池塘,每个池塘有权值,有m条无向边将池塘连接,现在要除掉一些池塘,除掉的池塘必须要有一条边与其相连,无自环,求删除完池塘后,求连通分量中的池塘个数是偶数的联通分量所有权值之和思路:类似拓扑排序,通过度数把点加入到队列中,然后开始删边和删点,点被删除后标记一下,然后就是把所有的点扫一遍DFS,统计连通分量中点的个数和权值而已了#include#inclu原创 2015-09-13 23:39:00 · 991 阅读 · 0 评论 -
树重心 poj1655 Balancing Act
传送门:点击打开链接题意:找到树的重心,要求平衡点相同时编号越小越好树重心是一个非常重要的东西,在树的分治中占有一席之地,能使树的分治的复杂度不会退化到O(n^2),是一种十分有效的手段树的重心的定义:将某一点删除,一颗树会分成许多棵子树,。一个树T的重心就是,删除了重心后,得到的那些子树中的最大子树的点数是最小的求法是利用树型dp的思路,很容易实现#include#incl原创 2015-10-05 11:04:09 · 988 阅读 · 0 评论 -
二分+树上乱搞 zoj3820 Building Fire Stations
传送门:点击打开链接题意:给你N个点,有N-1条边,构成了一棵树,每条边的距离都为1。现在要在N个点中选出2个点放灭火装置,要求N个点到最近的灭火装置的距离的最大值最小。求这两个点的位置。思路:首先,一般让最大值最小,都是二分的方法。所以我们主要应该讨论,假如到灭火装置的距离最大值因为zoj是G++所以没办法扩栈,,所以只能全部用队列写了感觉不是很方便 。。当然这题还要注意另外一些原创 2015-10-05 17:46:33 · 908 阅读 · 0 评论 -
欧拉回路 Codeforces723E One-Way Reform
传送门:点击打开链接题意:给你无向图,现在给无向图定向,使得最多的点,入度等于出度。思路:首先,对于无向图,奇数度的点,肯定是不能使得入度等于出度的。对于一个有向图欧拉回路,我们可以知道,欧拉回路上所有的点的入度等于出度。然后,我们还能知道一个性质,对于一个图,度为奇数的个数,一定是偶数。所以我们把度为奇数的点分成很多组,每组2个点,然后把每组内部的2个点连一条边。这样的话原创 2016-10-05 12:32:03 · 853 阅读 · 0 评论