刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

开关问题
有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)
时间限制:1000
内存限制:65536
输入
输入第一行有一个数K,表示以下有K组测试数据。 每组测试数据的格式如下: 第一行 一个数N(0 < N < 29) 第二行 N个0或者1的数,表示开始时N个开关状态。 第三行 N个0或者1的数,表示操作结束后N个开关的状态。 接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。
输出
如果有可行方法,输出总数,否则输出"Oh,it’s impossible~!!" 不包括引号
样例输入

2
3
0 0 0
1 1 1
1 2
1 3
2 1
2 3
3 1
3 2
0 0
3
0 0 0
1 0 1
1 2
2 1
0 0

样例输出

4
Oh,it's impossible~!!

提示
第一组数据的说明: 一共以下四种方法: 操作开关1 操作开关2 操作开关3 操作开关1、2、3 (不记顺序)

使用微信搜索喵呜刷题,轻松应对考试!

答案:

解析:

【喵呜刷题小喵解析】本题是一道典型的图论问题,可以通过并查集和拓扑排序来解决。首先,我们需要判断是否存在一种操作方式,使得所有开关的状态达到指定的状态。如果存在,我们再计算有多少种可以达到指定状态的方法。对于判断是否存在一种操作方式,我们可以使用并查集来维护开关的连通性,然后使用拓扑排序来判断是否存在环。如果存在环,说明无法将所有开关的状态达到指定的状态。对于计算有多少种可以达到指定状态的方法,我们可以在拓扑排序的过程中,统计所有入度为0的节点,即所有没有与其他开关相连的开关。对于每个入度为0的节点,如果它的状态与指定状态不同,那么就无法达到指定的状态。否则,我们可以将它的状态翻转,然后统计翻转后的状态与指定状态相同的节点数量,即为可以达到指定状态的方法数。具体的实现可以参考上述代码。
创作类型:
原创

本文链接:开关问题 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share