c – 图表可分性

给定一个简单的无向图,其中包含编号为1到N的N个顶点,每个顶点包含来自{1,2,… 7}的数字.从具有空字符串S的顶点1开始,我们通过一些顶点(没有限制)到达顶点N.对于路上的每个顶点,我们将相应的数字添加到字符串S的右侧.最后我们得到S为十进制整数.你被要求找到这样一种方法,即满足S可以被所有数字整除,并且S的数字之和必须尽可能小.

输入

有几个测试用例(最多15个),每个测试用例如下:

The first line contains a positive integer N (N ≤ 100).
The second line contains N digits (separated by spaces),the i-th digit is the value of the i-th vertex.
N last lines,each contains N values of {0,1} (separated by spaces),the j-th value of the i-th line is equal to 1 if there is an edge connecting two vertices (i,j),otherwise 0.

输入以N = 0结束.

产量

对于每个测试用例,在一行上输出找到的最小数字总和,如果没有解,则输出-1.

输入:
4

1 2 1 4

0 1 1 1

1 0 0 1

1 0 0 1

1 1 1 0

输出
7

请指导我

可以存在自循环和循环,使得节点1和节点N可以被任意次访问

解决方法

如果给定图形转换为其他图形,其中不允许循环,则可以使用 Dijkstra’s algorithm解决此问题.

要做到这一点,让我们从字符串可分性开始7.看看这个序列:1,10,100,…(mod 7).由于07是素数,因为Fermat’s little theorem,107-1 = 1(mod 7).这意味着1,…(mod 7)序列是周期性的,周期是6.这将用于转换这也允许使用Sn-1(mod 7)递归地计算Sn(mod 7):Sn = Sn-1 10n%6 * n_th_digit(mod 7).

有必要从节点N开始最短路径搜索,因为该路径可以在变换图的几个节点之一处结束.此外,这允许快速确定(使用路径的前2个节点),是否允许访问节点“5”,节点“4”和其他“偶数”节点.

算法的开放集(优先级队列)应该包含优先级本身(数字之和),只要3个附加位和3个余数:允许“4”,访问“3”,访问“7”,S%3,S%7和S.length%6.

图表应转换如下.每个顶点扩展到3个顶点,一个仅允许S%3 == 0,其他 – 对于S%3 == 1和S%3 == 2.然后将每个顶点扩展为7(对于S%7),然后将每个顶点扩展为6(对于S.length%6).可以将所有这些扩展适合原始图形:只需向每个节点添加一个3D数组(大小为3 * 7 * 6)的后向指针.在搜索最短路径时,非空的后向指针确定算法的闭集(它们不允许循环).当找到最短路径时,后向指针允许重建该路径中的节点序列.并且找到最短路径的时刻由访问节点1确定(node_3_not_visited || S%3 == 0)&& (node_7_not_visited || S%7 == 0).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...