#P828. 三角形灯阵

三角形灯阵

问题描述

中秋节的晚上,dd_engi在桌面上放了许多好看的彩灯。遗憾的是,这些彩灯可能并非全部都亮着。于是,你打算把全部这些彩灯都点亮。

但是,你很快发现,这些彩灯的摆放是非常有规律的,事实上,彩灯的位置都在平面的正三角形镶嵌的某个交点处。距离为单位长度的彩灯被认为相互相邻。可以看出,每个彩灯最多与六个彩灯相邻,相邻的彩灯都在以其为中心的单位正六边形的顶点上。

下图就是一种合法的彩灯摆放(对应样例数据):

其中,实心和空心的圆点分别代表亮与灭的彩灯,实线边代表彩灯间的相邻关系。

图中的边组成了若干单位正三角形(边长为单位长度的三角形),可以看出,每个彩灯与它相邻的彩灯最多可以组成六个单位正三角形。而所有的单位三角形可被分成两类,我们称为A类以及B类,图中加阴影的三角形属于A类。A类三角形的特征是,三个顶点分别在上方、左下方及右下方。

每个A类三角形中有一个开关(图中未画出),dd_engi告诉你,按动三角形中的开关开关会改变三个顶点上每个彩灯的亮灭状态(亮变成灭,灭变成亮)。

那么,要点亮所有彩灯,最少需要按动多少次开关呢?

输入格式

输入数据描述了每个彩灯的初始亮灭状态以及所有三角形。

第一行一个整数N,表示彩灯的数目,彩灯被编号为1至N。

第二行N个0或1的整数,第i个0或1表示第i个彩灯初始的状态是灭或亮。

第三行一个整数M,表示有M对彩灯相邻的关系。

以下M行,每行三个整数,表示一对彩灯相邻的关系。前两个整数即相邻的这一对彩灯的编号。第三个整数表示第二个彩灯相对于第一个彩灯的方位,0~5分别表示右方、右下、左下、左方、左上、右上。例如,“1 3 1”表示“第3个彩灯在第1个彩灯的右下方”。

输出格式

如果不可能做到点亮所有彩灯,输出-1,否则输出最小的步数。

样例输入

11

0 1 0 0 1 0 1 0 1 0 1

20

1 2 2

1 3 1

2 3 0

2 4 2

2 5 1

4 5 0

3 5 2

3 6 1

5 6 0

7 6 3

8 4 4

5 8 2

5 9 1

8 9 0

6 9 2

6 10 1

9 10 0

10 7 5

11 8 4

11 9 5

样例输出

4

数据范围

对于30%的数据,N<=100。

对于100%的数据,3<=N<=50000。