果然我还是不会2-sat
大概就是处理一些真假关系,把每个点拆成真假两个
如果a是真的b比是假的就从a的真连一条边到b的假,b的真连一条边到a的假
如果最后两个点在同一个环中那他们必同时选,所以如果缩点以后a的真假同时在一个强联通分量里就没有解
输出任意解的话看一下a的真假哪个的dfs序大就选哪个,tarjan缩点的顺序是反的所以选强联通分量编号小的那个
210. 【UER #6】寻找罪犯
考虑每句话的真假和每个人是不是罪犯
如果a是不罪犯的话那他的话一定都是真的,如果x说y是罪犯那如果y是罪犯这句话就是真的,否则x的话除了这句都是真的且x是罪犯,但这样的话边数是(O(n^2))的
考虑前缀和优化,如果g这句话是假的话那么g之前的话一定都是对的,从(g_y)的假连向(g-1)的真;如果g这句话是真的的话(g_y)一定和(g_x)所说一致,从(g_y)的真连向(g)的真;如果g这句话的前缀都是真的的话那么(g-1)的前缀一定也是真的,从(g)的真连向(g-1) 的真;如果a的话的最后一句的前缀里面有假话的话那么a一定是一个罪犯