图表可分性

时间:2012-05-07 17:23:25

标签: c++ algorithm graph division

给定一个简单的无向图,其中包含编号为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可以被任意次访问

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

首先在数学上找到集合中给出的数字的LCM。

lemme释义场景....给出一组数字......找到LCM然后以这样的方式遍历这些信号,使得它们的路径成为数字。因为它的LCM是数字,其总和是最小的

对于集合{0,1,2,3,4},LCM为12,因此从1到2的遍历 对于集合{0,1,2,3,4,5,6,7},LCM是420 ..(我认为我是对的)

答案 2 :(得分:0)

使用A*搜索算法,其中“cost”是数字的总和,divisibility确定您可以遍历哪些边。