HDU 6184 Counting Stars

一个三元环计数问题…… 当然是转化出来的…… 一开始没想到去计数三元环的思路,而是直接搜…… 然后发现题目理解错了…… 又发现这特么不就跟三元环数量有关么?? 巧的是薛昊之前问过我三元环计数,我还特意去看了几眼。不然真的可能卡不出来。 题意: 给你一张无向图,让你计数这样的子图。 V=(A,B,C,D) , E=(AB,BC,CD,DA,AC) 思路: 一开始我以为必须是矩形,然后发现同一点的不同三元环都满足条件。 所以我只要找到这个点的所有三元环数量,任意挑出两个即可。记得去重 个人三元环计数方法如下: 首先枚举每一条遍,再判断两个端点,确定度数较少的点,从这个点进行扩展一条边,再判断这条遍的另一端是否有边与第一条边的另一端点相连。 其中有很多细节值得优化,比如说对于( sqrt(m) )为分界进行不同的判定。 AC Code #include #define each(i, n) for (int(i)

51Nod 1967 路径定向

首先说一下这道题的思路真的是非常巧妙。 但是,出题人脑子进shi了么,难道一定要写法和你一样才能过???? 反正卡的特别紧,我到最后还有一个测试点一直超时。 时间限制是 1200s ,明显就是故意的。这种故意卡常在51Nod里巨特么多。搞不懂他们在想什么。 不觉得会在以后碰到类似的题目会故意卡我,因为很多人都是 1000 ~ 1200 的时间卡过的。 题意: 给你一个有向图,让你任意改动边的方向,使得出入度相同的点数最多。 并输出方案。 思路: 一眼看成上下界网络流。实际上这道题就是用上下界网络流改出来的,但就别想了,正解都卡着过,网络流能过? 建图方式和无汇源上下界可行流一致,跑一遍最大流即可。 下面是另一种思路。 有入度相同的特征的图还有一种,就是欧拉图,对于度数为奇数的点(以下简称奇点,反之偶点),必然不可能存在一个方案使得其出入点相同。这是必然的,那么反过来对于偶点,如果欧拉路径存在也就必然存在一个方案使得其出入度相同。 直接将所有奇点,顺序两两相连,跑一遍欧拉路径即可。 这里补充两点 1. 奇点数量必然为偶数。因为每一条遍贡献的…

HDU 2454 Degree Sequence of Graph G

Havel定理判定简单图 被上下界网络流烦傻了,暂时不想写代码太长的题。 虽然是一道水题,但也是建立在一定理论基础上的。 再科普一下简单图,没有重边没有自环的图就是简单图。区别有向图和无向图,也就是说,有向图的反向边不算重边。 给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化 可图化的判定: ( \sum_{i=1}^{n}d_{i} mod 2 == 0 ) 。关于具体图的构造,我们可以简单地把奇数度的点配对,剩下的全部搞成自环。 可简单图化的判定(Havel定理): 把序列排成不增序,即 ( d_1 \geq d_2 \geq \ldots \geq d_n ),则d可简单图化当且仅当 ( d’ = \left{ d_2-1 , d_…

洛谷 1155 双栈排序

别多说了,神题。 写不来,看得是大佬的题解 很妙,没想到用二分图染色,但是二分图染色的模型的确很适合这个题目。 不过关键还是那个判定定理。 题意: 给你一个序列,要你用两个栈给它排序,问你这个序列是否能排序成功。 思路: 上面的链接很详细,我这里简单说一蛤。 首先必须注意到判定两个数必须在两个不同的栈的充要条件。 S[i],S[j]两个元素不能进入同一个栈 <=> 存在k,满足i using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 1005; int ary[maxn]; int bmin[maxn]; i…

ZOJ 2314 Reactor Cooling

无汇源上下界可行流的模板题。 说是模板题,其实想让它除了二分以外加点变化也是有点困难的。 关于上下界网络流的问题,以前偷懒没学,本来打算这几天补上,加上今天薛昊这个催化剂又来问我,于是就今天开始补了。 在这里我非常非常非常非常非常推荐这篇博文 总结的非常详细,写的有十分通俗易懂,全文十分连贯,评论也有人说看完给人一种荡气回肠的感觉。 当我看完无汇源上下界可行流的时候,我马上敲了一蛤这道题,就一 A 了。妙啊! 下面简单说一下无汇源上下界可行流的解法,不详细说明,具体请看上面的链接。 无汇源上下界可行流可用建图+最大流解决,建图方式如下: * 对每个给定的边建边,容量为 up – down * 记录每个点的 down 流量差,这里设 入流量为正,出流量为负。如果总的流量差大于0,建边 src -> 该点,容量为流量差。否则,建边 该点 -> des 容量为流量差的负值。 没了,再跑一遍最大流,如果能满流就说明有可行流,…

ZOJ 3228 Searching the String

AC自动机吼题 虽然是很常规的模式串与匹配串的匹配计数问题,但它稍微给了一个新花样和一些坑。 写完这题,我当时就很感慨,如果我能在多校之前写过这题就好了…… 题意: 先给你一个匹配串,再给你很多模式串,模式串前都有标号。标号为 0 表示计数可重叠,标号为 1 表示计数不可重叠。 思路: 写不来呀………… 看了题解,kuangbin只说了一句,加一个数组维护一下就好了…………这特么怎么维护………… 看了代码大致能理解,开了一个 last 数组记录每个位置上一次被匹配时的位置。 如果匹配串的位置与AC自动机上的相应位置的上一匹配位置差距为这个模式串的长度以上,说明可以匹配。 特别想要详细说,但又觉得没有什么好说的,所谓大道至简,原理真的很简单。 AC Code #include #include #include #include using namespace std; const int max_n = 6e5 + 10; const int max_

HDU 2296 Ring

AC自动机+带权字符串DP 题目本身不是很难,但在处理上有点繁琐。 题意: 给你很多模式串,每个模式串都有一个权值,再给你一个限制长度,要你在限制长度内找出最短的字符串,使得权值和最大。若有多个结果,输出字典序最小的。 思路: 连AC自动机上的最短路都有了,加个权值也不是什么奇怪的事情。 这个加了权值有点像…………背包??不是么?? 想象不到的话将背包的物品替换成一个字符试试。 但是实际上都是我瞎猜罢了,我并没有按照背包的写法去写,还是很常规的按照节点和状态添加字符,到下一节点的下一状态。 稍微繁琐一点的就是要输出字符串,但所幸数据比较小,三维空间存的下。 #include #include #include #include using namespace std; const int inf = 0x3f3f3f3f; const int max_n = 100 * 20; const int max_c = 26; const int

POJ 1699 Best Sequence

AC自动机+spfa最短路 啊啊,明明AC自动机还有最后一题,今晚怕是写不完了,今天写的还有两道没写题解。 最后一道AC自动机与这一题有相似之处,是这一题的强力加强版本。 先把这题给解决了 题意: 给你很多碱基串,不同碱基串在前后缀相同的条件下可以重叠,要你求出最短的碱基串,包含所有给定串。 思路: AC自动机上状压SPFA,也可考虑TSP的模型。 还是属于比较基础的,连我都可以不看题解写出来的题目。 #include #include #include #include using namespace std; const int max_n = 250; const int max_c = 4; int key[130]; struct Aho { int next[max_n][max_c], fail[max_n]