随笔分类 - 图论
摘要:恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图,把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配。写的费用流。。最大权完美匹配KM算法没看懂#includeusing namespace std;const int maxn = 200+6;s...
阅读全文
摘要:Floyd的变形,本质是动态规划,路径分成的两个部分中取最大值作为该路径的答案,在所有可行路径之中选一个最小值。#includeusing namespace std;const int maxn = 101;int d[maxn][maxn];const int INF = 0x3f3f3f3f;...
阅读全文
摘要:最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。#includeusing namespace std;typedef long long ll;const int m...
阅读全文
摘要:互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈。#includeusing namespace std;const int maxn = 25;map mp;map::iterator it;vector names;bool d[maxn][maxn];int ID...
阅读全文
摘要:很经典的网络流模型,行编号和列编号分别看成一个点,行和列和分别看出容量,一个点(x,y)看出是一条边,边的容量下界是1,所以先减去1,之后在加上就好了。建图的时候注意分配好编号,解从残留网络中的边找。前向星建图的话,打印解会比较麻烦。#includeusing namespace std;const...
阅读全文
摘要:关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点。dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Testcase最后一个不要换行,没有testcase最后一个要加换行,想起那天gold miner PE...
阅读全文
摘要:隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化,二进制pre[i][0]表示可以出现的bug,那么u&pre[i][0] == u就表示u是可以出现的bug集合的子集,pre[i][1]表示必须出现的bug,那么u|pre[i...
阅读全文
摘要:先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点。正确性是基于一个贪心,在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少。边比较多,用prim求最小生成树,效果比Kruskal好,枚举套餐的时候在用Kruskal。prim和...
阅读全文
摘要:Kruskal+并查集。点很少,按边权值排序,枚举枚举L和R,并查集检查连通性。一旦连通,那么更新答案。判断连通可以O(1),之前O(n)判的,第一次写的过了,后来T。。#includeusing namespace std;const int maxn = 101;const int maxe =...
阅读全文
摘要:一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理直接map离散。当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000。需要注意的是有可能只有一个结点。#includeusing namespace std;const in...
阅读全文
摘要:CNF 2 'In Boolean logic, a formula is in conjunctive normal form (CNF) or clausal normal form if it is a conjunction of clauses, where a clause is a ...
阅读全文
摘要:正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图。然后求割边。注意重边,和卡spfa。正权,好好的dijkstra不用,用什么spfa?#includeusing namespace std;typedef long long ll;#define fi first#defin...
阅读全文
摘要:把'I'拆成容量为1一条边,一个入点一个出点,入点和相邻的'W'连一条容量为1的边,出点和相邻的'N'连一条容量为1,所有的'W'和源点连一条容量为1边,所有的'N'和汇点连一条容量为1的边,表示只能用一次。一发网络流就过了。写了4000B+的贪心,然并卵#includeusing namespac...
阅读全文
摘要:将源点和每个时间点连一条容量为k的边,表示同一时间最多剃k次胡子,将一个人和对应时间连一条容量为1的边,表示一个人在某个时间只能剃1次,再将每个人和汇点连一条容量为2的边表示一个人要剃两次。先是想贪心,结果不对,后来想到网络流,不会写好伤,下来写了好几发才过,写得依然丑。对最大流的理解加深了,图论有...
阅读全文
摘要:据说是DAG的dp,可用spfa来做,松弛操作改成变长。注意状态的表示。影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了。#includeusing namespace std;#define MP make_pair#define fi f...
阅读全文
摘要:由于互相憎恨的骑士不能相邻,把可以相邻的骑士连上无向边,会议要求是奇数,问题就是求不在任意一个简单奇圈上的结点个数。如果不是二分图,一定存在一个奇圈,同一个双连通分量中其它点一定可以加入奇圈。很明显,其它点和已知的奇圈相连总是有两条点数一奇一偶的路径,因此一定可以找到一条回路使得新的这个点加入一个奇...
阅读全文
摘要:每一单词相邻两个字母,不能同时为元音或者辅音。。。各种姿势都可以过:7个for,dp,黑白染色,dfs,并查集。。。。最主要的思路就是相邻字母连边,把元音和辅音看成两个集合,那么有连边的两个字母一定不能出现在同一个集合中,于是想到了二分图判断的二染色。比较坑的是,必须要出现5个元音字母见识到了str...
阅读全文
摘要:图给得很良心,一个s到t的有向图,权值至少为1,求出最短路,如果是一定经过的边,输出"YES",如果可以通过修改权值,保证一定经过这条边,输出"CAN",并且输出最小修改值,否则输出"NO"。保证有s到t的路径,可能有重边。建正反两个图,分别求出s和t的最短路径,用来判断一条边是不是在最短路径上,然...
阅读全文
摘要:题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它。一个人从1号点出发,给出初始金钱,问你能不能访问所以的点,并且获得所以证书。题解:目标是那些一定要访问的点,怎么到达的我们不关心,但是我们关心...
阅读全文
摘要:神坑题。这题的坑点有1.判断连通,2.有重边,3.至少要有一个人背炸药因为有重边,tarjan的时候不能用子结点和父节点来判断是不是树边的二次访问,所以我的采用用前向星存边编号的奇偶性关系,用^1来判断是不是树边#include#include#includeusing namespace std;...
阅读全文

浙公网安备 33010602011771号