04 2013 档案
摘要:题意:有F快草地,每块草地上有若干奶牛也有避雨点,每个避雨点只能够容纳一定量的奶牛。草地之间有边。现在问所有牛全部到达避雨点的时间是多少?解法:这题和POJ-2112非常相似,做法也差不多,folyd处理之后二分枚举答案。该题的构图稍微难一点,需要考虑到一个流量的控制问题,即当某一点多余的流量流出去后必须在下一个点停止住。自己是把一个点拆成了3个点进行控制,后面学习了别人拆成两个点也能完成。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#i
阅读全文
摘要:题意:给定一些散列的源点会汇点,求解网络流。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int INF = 0x3fffffff;const int SS = 105, TT = 106;int n, np, nc, m;struct Edge { int v, c, next; };Edge e[100000];int idx, he
阅读全文
摘要:题意:有C头奶牛,K个挤奶站,每个挤奶器最多服务M头奶牛,奶牛和奶牛、奶牛和挤奶站、挤奶站和挤奶站之间都存在一定的距离。现在问满足所有的奶牛都能够被挤奶器服务到的情况下,行走距离的最远的奶牛的至少要走多远。解法:又是一个求最大中的最小问题,很容易想到用二分枚举来得出正确的答案。首先对整个图做一个floyd,求出两两之间的最短路,然后再枚举一个最大距离值进行构边,每次询问是否能够全部奶牛都能够被匹配到。注意:距离为0是当作INF处理,否则在floyd取min的时候要特判。代码如下:#include <cstdlib>#include <cstdio>#include &l
阅读全文
摘要:题意:很裸,M和N的顺序别搞错了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int N, M;const int INF = 0x3f3f3f3f;struct Edge { int v, c, next; }e[500];int idx, head[205];int level[205];int front, tail, que[205];vo
阅读全文
摘要:题意:一个农夫要把养殖的猪卖出去,现有M个猪圈,农夫自己没有猪圈的钥匙。现有N个客户要来买猪,每个客户手中有Ai把钥匙,分别表示成猪圈的编号,并且每个客户需要买一定的猪。这些客户依次过来(编号从小到大),现在农夫可以选择如何将这些猪卖给每一个客户,只要头数不超过需求即可。农夫在处理好每一笔交易后能够将打开的猪圈门之内的猪任意分配。现在问农夫能够卖出最多的猪的数量。解法:通过这一题,发现构边的时候其实是有很多技巧的,这题如果把猪圈放到图中的话那么将成为一道不可做题。原因是时间复杂度和空间复杂度太高了。其实可以画出一个简图,然后再通过合并边和合并点来简化构图。由于农夫能够在打开猪圈后任意分配猪。因
阅读全文
摘要:A:ZZ买衣服简单的字符串处理问题,需要注意的是某一天买了之后接下来的天数中不能够再次购买。代码如下:Problem A_set#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <algorithm>#include <set>using namespace std;int N, M;set<string>st;int main() { char str[100
阅读全文
摘要:题意:给定一个函数定义如下:对于q个点满足:给定f[1]-f[n]的数值,然后存在q个特殊的点,其于前面的关联的项数特殊,系数特殊,当然位置也特殊。现在要求f[n]的值。解法:如果题目中没有强调q个特殊点的话,那么可以使用矩阵快速幂搞出来。鉴于只有最多100个特殊点,我们可以选择分段进行处理,对每一个空隙进行一次矩阵快速运算,然后对于特殊点单独做一次。这里又有一个地方要特别注意:那就是q个点中有位置大于n的点。当然仅仅是一般的矩阵快速幂这题的复杂度将达到O(q*log(n)*L^3),结合多组数据这样会超时,一个优化就是使用一个列向量去依次乘以若干个矩阵,那么每一次相乘的复杂度就变成了L^2,
阅读全文
摘要:题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向。并且当相邻两个蚂蚁相撞时转向。现在问t时间后各个蚂蚁的位置。解法:这题的一个致命技巧就是把两只蚂蚁的相撞看作是两只蚂蚁交换穿过对方并且交换蚂蚁的编号。这个是很好理解的,类似于物理的完全弹性碰撞。又由于任何两只蚂蚁的相对位置在这种转弯的情况下不会改变相对位置,因此我们只要视作所有蚂蚁没有蚂蚁的行动。最后根据位置关系对应到原始的位置关系。最后再做位置判断的时候查看是否超出坐标之外即可。代码如下:#include <cstdlib>#include <cstring>#include <cstd
阅读全文
摘要:题意:有N个节点的图,现在要求构成一棵树(不存在环),且只能够有一个跟节点,每一层的节点数还必须相同。问有多少种不同的方式。解法:对于N个节点而言,如果第N个节点是N-1个节点任意一种组合情况下的boss的boss,这种事满足情况的,用f[N]表示方案数的话,那么这部分的值就是f[N-1];如果N不属于上面的情况,那么可以认为N个节点的组合下,boss下面就直接分成了一个个支,由于各层节点数要相等,因此每个分支的情况都要一样,所以N-1有多少个大于2的因子就有多少种情况了。综上:如果把f[x-1]看作一个分支的话,有:代码如下:#include <cstdlib>#include
阅读全文
摘要:题意:给定一个数N(1<=N<=10000),求N的一个最小的倍数能够被N整除。解法:粗看起来题意简单,但是确无从下手,其实正确的解法就是通过搜索来搞定,由于N不太,因此N的余数类也不会很大,采用从小到大的枚举策略能够使得后面达到的同余类状态不及前面的优秀,这样就能够在非常短的时间内找到答案。bfs过程中对于在状态与状态之间建立前驱指针,这样就能够输出最后的结果。一个状态需要记录以下值:1.当前状态对N的余数;2.当前放置的数字;3.前驱指针。状态之间的转移:mod' = (mod*10 + digit) % N从1位开始依次枚举,然后扩大到2位,3位.....代码如下:#
阅读全文
摘要:题意:给定一个数x,现在定义f(x)是a*b|x的情况下,a,b的组合情况有多少种。现在给定一个数N求f(1)+f(2)+...+f(N)。解法:一开始想到了a*b是x的约数,因此推出了f(x)的公式,也就是这个公式,使得我们在求前缀和的道路上寸步难行......正确的解法是对于任意一个a*b|c可以视为a*b*c = x,那么就把前缀和问题转化为a*b*c <= x的解的组合个数问题了。三个数a,b,c先暂时不考虑其位置关系带来的不同,规定a<=b<=c,那么分情况讨论:1.当a=b=c时有一种排列情况2.当a=b<c时有三种排列情况3.当a<b=c时有三种排列
阅读全文
摘要:题意:给定一系列的单词要求按照字典序把他们全部输出来。解法:首先判定能不能构成欧拉回路,然后就是O(E)的dfs计算出来。这题使用Fleury模板没搞出来,原因这里要根据单词来走边,而该算法得到的是节点访问序列。后面看到一种dfs,既能够保留边又能够保留点又简单多了,以后果断专注这种写法。代码如下:#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <string>#include <vector>#incl
阅读全文
摘要:题意:对于一个长度为2^N的循环序列,从某一个位置开始依次取N个,这样就能够生成2^N个序列,现在要求输出一个最小的满足要求的循环序列。输出这个序列生成的第K个数字是多少?解法:套用Fleury算法,构边的时候保持从小到大的顺序即可。如果是生成N为序列的话,就考虑前N-1位构成的节点相互的连的边(例如三位数就可以这样构边 00 --> 01 --> 11那么这两条边就代表生成了001和011这两个数字),输出欧拉回路即可。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#incl
阅读全文
摘要:上面是摘自图论书上的定义。算法在运行过程中删除了所有已走的路径,也就是说途中残留了所有没有行走的边。根据割边的定义,如果在搜索过程中遇到割边意味着当前的搜索路径需要改进,即提前输出某一个联通子集的访问序列,这样就能够保证访问完其中联通子图中后再通过割边访问后一个联通子图,最后再沿原路输出一开始到达该点的路径。如果只有割边可以扩展的话,只需要考虑先输出割边的另一部分联通子集访问序列。样例图:代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#in
阅读全文
摘要:题意:给定一个进行了集合划分的序列,现有一套标准答案,同样给定了M个非标准答案,现在要计算这M个非标准答案的最大正确率为多少?解法:该题考虑的是可以采用不同的字符进行相同的划分。那么求解的就是一个集合符号的匹配的问题,采用何种的集合符号一一对应才能使得正确率最高。那么对于每对应某个位置的集合标号,我们可以假设是对应的,那么在这个基础上再进行更多的匹配,建立起x字符对应y字符最多能够对多少个的一个边,然后调用KM算法即可。在读取数据的时候使用gechar死活过不了(会读到非字母导致RE,可能是数据中有多个空格或者...),还好有cin这个利器,不过就是速度慢了点。代码如下:#include &l
阅读全文
摘要:题意:给定一系列的匹配关系,现在有些匹配时不允许的,问最大匹配时多少。解法:解决问题的办法就是在计算松弛d值的时候,如果d的值在经过一次可行标的更新后仍然不能得到某个最小值来扩充原图的边集。那么就不存在一个最优权值匹配。注意当值为负的时候就不能够匹配。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;
阅读全文
摘要:题意:这题自己YY了下,没想到结论还是对的。题目告诉我们一个有向图,现在问将图中的每一个点都划分到一个环中的最少代价是多少?每条边都有一个代价。解法:由于要成环,那么将这个图进行拆点,就变成了单向的二分图了,此时一个完备匹配就是一种连线策略,只要保证没有边是和自己相连,就能够满足题目中要求的每个点至少属于一个环。证明也是很简单的。因为我们总可以从一个完备匹配中找出起点,然后再从匹配点作为起点找......左图可以看做是1,2成环,3,4,5成环。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>
阅读全文
摘要:题意:给定一个二分图,N个点对应M个点,两两之间存在一组关系,每组关系一个权值。题目中了给定了一个匹配方案,现在要求满足这组关系中的最大的匹配权值在原方案上增长了多少?并且还要求求出在原匹配方案上改变最少多少条边能够得到这个最大匹配?解法:该题求增加了多少匹配值非常好算,问题就是这个最少改变多少条边。前面做过一道题目使用dfs遍历出所有的最优匹配情况,果断用在这里超时,主要原因是点过多,当然还有就是最大匹配不太好剪枝。想了许久硬了没有法子。百度......正确的解法真他妈犀利,主要思想就是增加原配边的权值,而且又不会对结果造成影响。这听起来似乎是不太可能的,但是确实有办法能够办到。首先由于顶点
阅读全文
摘要:题意:此乃第一道真正意义上的最大权值匹配,其他题目其实都是求一个最小权值匹配。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;int N;int w[305][305];int lx[305], ly[305];int sx[305], sy[305];int match[305], slack[3
阅读全文
摘要:题意:给定平面上两类同样多的点,要求输出一种方案使得所有匹配的点的连线两两不相交。解法:考虑到下面的一般情况:可以很容易的证明两条交叉边的距离和一定大于两条不交叉的距离和,因此问题转化为只要原图中存在交叉边,那么就可以找到更小的匹配的方式使得总距离更小。使用KM算法求出最小权值匹配输出匹配方案即可。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#include <cmath>u
阅读全文
摘要:题意:给定N个限定了边长范围的正方形,现在要把它们全部铺到长度固定,高度不限的墙上,一共有N种颜色一一对应使用,告诉每种颜色的单位面积价格。问铺满墙的最少开销是多少?只要长度为L的墙被覆盖了所有长度即可。解法:该题有个良好的性质为不论给定的正方形的顺序如何,都不影响最后的结果。设状态f[i][j][k]表示放置到第i个覆盖长度为j,且颜色选择为k时的最少开销。其中k是状态压缩的选择方案。那么有动态规划方程f[i][j][k] = min(f[i][j][k], f[i-1][j-p][k']) 其中p为第i个正方形合法的取值边长,k'为选择了i-1种颜色的方案,也是是k‘中有i
阅读全文
摘要:题意:给定一个字符串,按照要求输出来。解法:每次进行一次首字母判定,然后根据不同的情况进行递归。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>using namespace std;char str[300];string display(int ti, int sta, int fuck) { string ret; if (sta >
阅读全文
摘要:A.连续子串和贪心题,枚举每一个数字作为结束点。保留前i位的前缀和sum[i],对于第i为结束的合法序列,其值为sum[i]-sum[i-K],sum[i]-sum[i-K-1],...,sum[i]-sum[0],那么我们只需要对每一个 i 保留sum[0]到sum[i-K]的最小值即可。代码如下:Problem A#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int INF = 0x7ffff
阅读全文
摘要:Description求区间[a,b]包含1的数量。例如区间[111,112], 整个区间包含两个数,分别为111,112,111包含3个1,而112包含2个1,所以区间[111,112]总共包含5个1.Input多组测试数据。每组测试数据包含两个整数a,b, 1 <= a<=b<=10^18.Output每组测试输出一行,表示1的数量,结果mod 10^9+7.Sample Input111 112 1 1000Sample Output5 301代码如下:#include <cstdlib>#include <cstdio>#include <
阅读全文
摘要:题意:给定两个关系矩阵,分别表示雇主和雇员的相互好感度,好感度为1最优,N最差。如果一个人与好感度为P的人匹配的话,差值为P-1,现在要求是的总共的差值最小的匹配方法,并且输出所有的匹配方案。解法:将两两关系矩阵转化为边上的权值,然后进行一次最大匹配,最后dfs枚举输出结果,数据中给的矩阵上下颠倒了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>
阅读全文
摘要:做这题的时候突然觉得每次修改一次可行标就一定能够找到增广路,因此把while(1)改成了int T = 2; while(T--) {}谁知道WA了,这就比较纠结了,后面手动模拟了一组数据才知道不在交错树的点不一定不在已经存在的匹配中,增加的可行边右端点可能就落在了一条匹配边上,那么这样一来并不能保证找到一条增广路。这样也就解释了为什么对于slack[]数组每次进行一个更新,因为这个值由于循环次数的增加可能多次被利用到,没有找到增广路,那么原来的那条交错树一定还会边遍历一遍,而且会有新的节点加入到S和T集合(其实反正都会遍历一遍,那么不更新slack数组,dfs过程中也会自动缩小)。题意:有N
阅读全文
摘要:题意:给定一个网格图,图上有一些人要到一些房子当中去,人和房子的数量一样多,人和房子的曼哈顿距离作为行走的开销,问所有人走到房子中的最小开销。解法:将人和房子之间两两之间建立带权边,权值为曼哈顿距离的相反数,这样问题就转化为最大权值匹配问题。代码如下:#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;int N
阅读全文
摘要://*******************************以下是转载的*******************************************二分图匹配算法总结二分图最大匹配的匈牙利算法二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。最大匹配:图中包含边数最多的匹配称为图的最大匹配。完美匹配:如果所有点都在匹配边上,称这个最大匹配是完美匹配。最小覆盖:最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数最小路径覆盖:用尽量少的不相交简单路
阅读全文
摘要:题意:有N件物品和V体积的背包,没见物品由所占空间和价值组成,现问第K大能够装多少物品?解法:通过增加一维信息f[i][j][k]表示占用放到第i件物品时空间为j是第k大值时多少,f[i][j][k]无法给出一个明确的转移的方程,但是我们知道第i件物品若放置的话那么能够由f[i][j-w[i]][1...K]生成K中状态,如果不放置的话就能由f[i][j][0...K]生成K种状态,分别由这2*K个状态能够得到放或者是不放的前K大,因为综合的前K大一定在放的前K大或者是不放的前K大里面。代码如下:#include <cstdlib>#include <cstdio>#i
阅读全文
摘要:题意:给定一群人的姓名和昵称,给定了一些关系,现在要求判定姓名和昵称能够一一对应的有哪些?解法:一开始直接使用藏匿点的所有人和邮件进行构边,再用删除来判定,结果出错,为什么呢?因为我们将藏匿点的所有人和邮件连边确定的就是一种可能关系,然而题目中还隐藏了许多的可能关系,比如某人在藏匿点但是没有发邮件,那么其和其他未出现的昵称之间存在可能关系。正确的解法是确定不可能关系,因为这样更加简单,在藏匿点外的人不可能与邮件有关系。初始化所有人和所有昵称都有关系,通过排除不可能的关系即确定了可能的关系。之后再枚举每一条边,将其删除看通过最大匹配是否减小来断定这条边是不是被唯一对应。注意:如果某一组名字-昵称
阅读全文
摘要:题意:给定一个网格,现在某些格子坐标中有一个小行星,现有一种武器能够击穿一行或者是一列的小行星,问最少使用多少次这种武器能够销毁所有的小行星。解法:由于每一个点只要被行或者列覆盖到就可以,因此可以将某一点所在的行和列进行匹配,问题就转化为求一个最小顶点覆盖就可以了,因为这样能够保证每一条边都有一个顶点在点集内。也即每个小行星都能够被所在的行或者是所在的列覆盖到。代码如下:#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#include <algo
阅读全文
摘要:题意:有N个十字路口,这些十字路口通过M条路连接,边是单向的,现在要派一些伞兵去空袭这些十字路口,每个伞兵可以沿着一条路空袭沿路的十字路口,问最少要派出多少伞兵。解法:对于有向无环图求最小的路径覆盖数相当于将原图中的点拆开后,求一个最大匹配数,然后用顶点数减去最大匹配数就是最小路径覆盖了。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int N, M
阅读全文
摘要:题意:有许多男女同学,他们之间互相喜欢,现要求出一个最大的独立子集出来。解法:由于题目中说明了这种喜欢关系只存在于男女之间,因此可以大胆的拆点构图,因为男的喜欢的必定是女的,而女的之间不可能存在边(喜欢关系)。最大独立子集=顶点数-最大匹配数。由于是拆点构图,需要对最后的结果除以2。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int N, matc
阅读全文
摘要:题意:有一块土地,某些地方被挖去了,现在允许以每相邻的两块进行出售,问最多能出售多少块出去。解法:其实相邻即曼哈顿距离为1,那么最经典的方式当然是黑白染色棋盘来进行构图了,但是这题数据量太大了,虽然知道会MLE或者TLE,不过还是写了一遍。正确的解法当然是把所有的合法的点抠出来,题目已经告诉我们这样的点不会超过50个,所以不用当心任何问题,然后就是枚举两两组合是否相邻进行构图,然后求出最大匹配出售。这个枚举过程其实也是将图进行了拆点处理,曼哈顿距离为1的组合方式确保了从一点连出去的边的另一端点内部曼哈顿距离一定不为1,所以拆点后仍可以将坐标和为奇数的点看做X部,坐标和为偶数的点看做Y部,所不同
阅读全文
摘要:题意:给定一些学生和课程的关系,问是否每一门课程能唯一对应一个学生。解法:每一条边对应一个选择关系,问题就是求一个完备匹配是否存在。代码如下:#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int P, N;char G[105][305], vis[305];int match[305];bool path(int u) { for (int i = 1; i
阅读全文
摘要:以前在杭电上做过,不过代码提交到POJ就WA了,原因还是程序存在一定的bug:http://www.cnblogs.com/Lyush/archive/2012/03/28/2422060.html在处理开始状态为0状态,匹配结果不进行统计的过程中,正确的处理方式应该是忽略掉所有能够工作的0状态的所有工作,因为这样的工作肯定是先让他们在0状态工作完。然后将其他的工作进行连边,然后求一个最大顶点覆盖(所有的边都至少有一个顶点落在所求顶点集合内),也即所有的工作至少能够有一台机器进行执行。代码如下:#include <cstdlib>#include <cstring>#i
阅读全文
摘要:题意:给定一个方格,格子中的每点由空地,草地和墙组成,每个空地可以放置一个机器人,每个机器人能够向四个方向扫射激光,所以要给定一种方案能够在棋盘上放置足够多的机器人。激光可以穿过草地但是不能够穿过墙。解法:这题其实就是经典的二分匹配构图题,做法是将行和列进行拆分,也即如果某一行中有一堵墙,那么将墙前面和后面视为不同的一行,对列进行同样的处理,那么每个空地就需要获得一个新的行和列属性,通过遍历整个图来给每一块空地分配一个行和列号。分配要尽可能的紧凑。对于任何一块空地,要占用一个行和一个列(意味着该行和该列内不能够再容下其他空地)对于每一块空地,将其所对应的行号和列号分为图两个部分,构成二分图。二
阅读全文
摘要:题意:给定一个棋盘,如果在某一个点放置棋子,那么这个棋子出现的行和列都不够有其他的棋子,除非他们之间有墙相隔。现在给定一个含有墙的和空地的棋盘,问最多能够放置多少棋子。解法:将所有为"."的点保存起来,如果两个点不在同一行且不在同一列,那么在两个点之间连一条边,否则判定两点之间是否有墙相隔,有的话连边,否则不连,最后求一个最大团即可。代码如下:#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;i
阅读全文
摘要:题意:给定一个邻接矩阵,求最大团。解法:直接AC。代码如下:#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;int N, mp[55][55];int ret, st[55], cnt[55];void dfs(int x, int num) { int flag; for (int i = x+1; i < N; ++i) { if (!mp[x][i]
阅读全文
摘要:题意:给定一个图,现在要给这个图上色,要求相邻的元素不能够涂上同样的颜色,一共只有两种颜色,黑色和白色。问给定的图最多能够涂上黑色点。解法:从相邻的点不能够涂上相同的颜色我们可以得出该题的实质就是要求一个最大的点独立集,而求一个图的点独立集如果所给的图是一棵树的话,就可以通过拆点转化为二分图来解了,由于给定的图很可能成环,因此化作二分图的做法在这里不再适应。另一个对应的问题就是通过对原图建一个反图,然后对反图做一个最大团的求解,最大团保证了是反图中的最大完全子集,任何两个元素之间都有边相连,反应在原图中则是任意两两之间不存在边,也就是两两不相邻,这刚好契合的题意。这是一个最简单的球最大团的版本
阅读全文
摘要:题意:给定一个方格,然后告诉你一些规则,这些规则下方格中的有些位置是相冲突的。问在方格中最多能够放置多少个士兵。分析:比赛时一开始就想着用状态压缩DP来搞,不过忘了相邻三行产生关系同样可以通过添加状态的维数来解,于是想着旋转45度之后再DP,这样就只有两行发生关系,不过写起来应该不太好写。后面就用二分匹配写了该题,结果一直WA,知道比赛之后才明白原来这题不能够进行拆点构图,因为从一个点引出去的边的端点相互之间是可以连边的,这就相当于一个成环了,而有环的图又怎么划分出两个内部没有边的二分图呢?其实拆点是用求树的最小路径覆盖的问题上的,这题显然不满足。正确的解法是状态压缩DP或者是求反建图的最大团
阅读全文