zju2010校赛 G题

(转自ROBA神牛:http://roba.rushcj.com/?p=469

Problem G. Islands

这题我觉得我的做法可能有点复杂了。首先的观察是,因为不允许有多余的边,所以最后补出来的结果必定每个点都有一入一出,所以如果某个点的入度或出度大于1的话,直接无解。然后我们可以发现,如果一开始没有任何边的话,实际上这就是一个错排问题,也就是求一个1..N的排列使得每个数都不在它对应的位置上。下面先来说错排问题的递推解法(关于错排还能用容斥原理得到一个漂亮的公式,此处略):

设n个数的错排方案数是f[n],考虑最左边一个位置A,设它指向B,则有两种情况:
(1)B指回A,这时还剩n-2个数,所以问题变成了N-2个数的错排
(2)B指向A以外的数,这时我们会发现得到了一个N-1个数的错排(因为A已经确定指向B,本来是限制B不能指向自身,现在变成了限制B不能指向A,其实是一样的)

因为A一开始可以有n-1种B的选择,所以就有 f[n] = (n-1) * (f[n-1] + f[n-2])

现在的复杂之处在于这个排列里某些位置的值已经确定了(就是那些已经存在的边),除掉这种边以后,剩下的位置就分为了两类,一类是没有任何限制的,一类是不能指向它自身的。比如有五个点,已经有(2->3),(3->4)两条边,则4这个点就是没有任何限制的(它可以随便指向1或2或5),而1,5两点不能指向自身。类比错排问题的递推,我们用f[n][m]表示n个被限制不得指向自身,m个无限制的方案数,仍考虑第一个位置A,则有如下几种情况:

(1) A指向了一个有限制的B,共有(n-1)个这样的B,则有两种情况:
1a. B指回A,问题变成n-2个有限制,m个无限制
1b. B指向其他数,问题变成n-1个有限制,m个无限制(B的限制是不能指回A,类似上面错排第二种情况的讨论)

(2)A指向了一个无限制的B,共有m个这样的B,同样有两种情况:
2a. B指回A,问题变成n-1个有限制,m-1个无限制
2b. B指向其他数,变成n个有限制,m-1个无限制(这时B从无限制变成了有限制)

综上得到递推方程 f[n][m] = (n-1) * (f[n-2][m] + f[n-1][m]) + m * (f[n-1][m-1] + f[n][m-1])

边界条件是f[0][0] = 1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值