nanchang B A Funny Bipartite Graph

题意是:给你一个二分图,让你在其中选一些边,边和边两边的点构成一个新图,然后问新图的最小代价?
新图要满足两个条件:右边的点必须全选,左边的点必须满足互斥关系。

原图也满足一些性质,每个点的度小于3,左边的每个点不会向左边编号比它小的点连边。

为什么爆搜能过,为什么爆搜能过,为什么爆搜能过。。。。。。

而且还比我快。

爆搜就是加个剪枝,如果当前的sum比ans大就不继续往下搜了。。。。不会证复杂度。

然后我写的大概是一个折半dp预处理的做法,慢了十倍左右

就是首先不加剪枝的爆搜一定会tle嘛,然后就考虑折半的复杂度,因为他保证每个点不会连向比它小的点,然后我们爆搜左边前一半的点,这样右边前一半的点一定会都被选到,然后dp记录所有的状态,dp[sl][sr]表示左边上一半状态为sl的时候,右边下半部分为加入了sr的时候最小花费。

因为每个点最多向右连3条边,一共27条边嘛,然后又有右边每个点最多连一条边(显然),右边前一半的点一定会被选到的限制,爆搜复杂度肯定是ok的嘛,具体没算。

然后爆搜左边下半部分的点,这样确定的右边的状态是这次的状态 sr^(1<<(n)-1)^(1<<(n/2)-1),就是所有点减去这次搜的点。然后确定左边的状态,考虑这次的转态sl会有一个互斥的状态ban,那么合法的状态就是 ~ban的子集。

只有把第一次的dp再子集dp一下,就可以o(1)得到了。这个高位前缀和直接子集dp复杂度都是可以的,分别是2^n*(n/2)和2^(n/2)*3^(n/2)的。

附一下代码:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值