传送门:http://poj.org/problem?id=2942
尽管我承认这题我几乎是对着书抄的代码(因为我还不熟- -),但是我还是WA了三次- -数组又没清零。
基本思想就是:
首先把不互相憎恨的骑士连边。
求双连通分量bcc。
判断每个bcc是不是二分图,是的话这个二分图里的骑士都没法参加会议。因为形不成奇圈。
奇圈就是奇数个点连成的圈啦~
二分图是不可能有奇圈的(有的话你告诉我三个点的奇圈中一个点在左边的点集,一个点在右边的点集,那剩下的那个在哪里?)
每个非二分图的双连通分量里的点都可以是某个奇圈的一部分。
为啥?
假设我们有个叫B的非二分图的dcc。
里面至少有一个奇圈C。
我们还假设里面有个点叫v。
根据连通性,从v一定可以到达C中的某个点u1;
根据双连通性,C中还有另外一个u2,使得从v到u1的一条路径和v到u2的一条路径不相交(除起点外无公共结点)。
因为在C中u1到u2的路径长度一奇一偶,所以不管从u2经过v到达u1的路径长度的奇偶性如何,总能构造出一个奇圈使得v属于这个奇圈。
于是这道题就可做了。
注意一个地方:割顶有可能属于多个双连通分量,所以要开个bool数组记录一下。
#include<cstdio>
#include<iostream>