[bzoj4424]Fairy

时间:2022-10-27 16:50:01

很久之前想写这题。结果还是把握不住CF的E,太神了啊。。。。。。。

首先考虑的是二分图的性质,这个so easy,图中不存在奇数环。

然后分三种情况考虑:

1.只有一个奇数环,随便删除哪条

2.多个奇数环,删除它们都覆盖的那条

3.没有奇数环,岂不是爽爆了。。?

然后还引入了“返祖边”的概念,这个具体可以看博客http://blog.csdn.net/DaD3zZ/article/details/50879626  太神了反正我一点都不会

其中详细叙述了删哪条,怎么删的问题,类似于一个前缀和的思想,给每一条返祖边都打上一个标记。

1.如果它是返祖边,并且在唯一的一个奇环上,那么可以删

2如果它是树上奇环边,并且被所有奇环覆盖,并且不被偶环覆盖,那么也可以删

个人感觉最重要的还是dp的过程:odd[i]表示i的父边奇环,even表示偶环

void work(int u)
{
  flag[u]=;int e=head[u];
  )
  {
    int v=vet[e];
    )/]&&flag[v]==)
    {
      work(v);
      odd[u]+=odd[v];even[u]+=even[v];
      road[(e+)/].o=odd[v];road[(e+)/].e=even[v];
    }
    e=next[e];
  }
}

work