对每个点定义(u,t,0/1)为编号为u的人在t时刻是活/死。
当u在t时刻死亡,那他在t+1时刻也必然死亡,(u,1,t)->(u,1,t+1)
当u在t+1时刻活着,那他必然在t时刻也活着,(u,0,t)->(u,0,t-1)
再对两个限制条件分别连边,
限制1:
(t,x,1)→(t+1,y,1),(t+1,y,0)→(t,x,0)
限制2:
(t,x,0)→(t,y,1),(t,y,0)→(t,x,1)
要求的是对一个点u在T+1时与他一起存活的人。不难转化为一个传递闭包问题。
从以上连边发现,生情况与死情况分别在内部连边,而只有生->死的边没有死->生的边。
所以原图是拓扑图所以我们的问题变成了对于每一个(x,0,T+1)求出它能够到达的所有(y,1,T+1)的状态数。
画出图,不难发现大量出度为一的点无用,于是可以把这些点全部去掉,也就等价于只留下T+1时刻的点与限制边的出点。
此时只有(2n+2m)个点,于是用bitset优化一下即可。。。
代码:
原文:https://www.cnblogs.com/3soon/p/11834765.html