#P16844. [NWRRC 2020]Grammar Path

[NWRRC 2020]Grammar Path

题目描述

给定一个处于 Chomsky 简化形式(Chomsky reduced form)的上下文无关文法,以及一个有向图。图中每条边都标有该文法的一个终结符。

请找出从顶点 ss 到顶点 tt 的最短路径长度,使得沿这条路径依次经过的边标签连接起来后,得到的字符串属于该文法所描述的语言。

如果不存在这样的路径,请输出 NO

输入格式

第一行包含一个整数 pp,表示文法产生式的数量:

1p100.1\le p\le 100.

接下来 pp 行,每行给出一条产生式,格式为以下两种之一:

A -> BC

A -> a

其中:

  • 小写英文字母表示终结符;
  • 大写英文字母表示非终结符;
  • 大写字母 S 是开始非终结符。

保证 S 至少作为一条产生式的左部出现一次。

接下来一行包含四个整数 n,m,s,tn,m,s,t

1s,tn26,0mn2.1\le s,t\le n\le 26,\qquad 0\le m\le n^2.

分别表示图的顶点数、边数、起点编号和终点编号。

接下来 mm 行,每行格式为:

u v x

表示存在一条从顶点 uu 指向顶点 vv、标签为小写字母 xx 的有向边,其中

1u,vn.1\le u,v\le n.

图中没有重边,但允许自环,也可能同时存在 uvu\to vvuv\to u 两条方向相反的边。

输出格式

如果不存在从 sstt 的路径,使得路径上的标签串属于该文法的语言,输出:

NO

否则输出满足条件的最短路径长度。

说明

非正式地说,上下文无关文法由以下内容构成:

  • 一组终结符(本题中为小写英文字母);
  • 一组非终结符(本题中为大写英文字母);
  • 若干产生式,用于将一个非终结符替换为一串非终结符或终结符。

Chomsky 简化形式要求每条产生式的右部只能是:

  • 一个终结符;或
  • 恰好两个非终结符。

事实上,任何不生成空串的上下文无关文法都可以转化为这种形式。

如果从单独的开始非终结符 S 出发,通过若干次使用产生式能够得到某个终结符字符串,那么该字符串就属于这个文法的语言。

后两个样例中的文法描述了所有非空合法括号序列,其中字符 c 表示左括号,字符 j 表示右括号。

样例 1

5
S -> AB
A -> a
A -> AA
B -> BB
B -> b
8 8 1 4
1 2 a
2 3 b
3 4 a
1 5 a
5 6 a
6 7 a
7 8 b
8 4 b
5

样例 2

6
S -> SS
S -> LA
S -> LR
A -> SR
L -> c
R -> j
4 5 1 1
1 2 c
2 3 c
3 1 j
1 4 j
4 3 j
12

样例 3

6
S -> SS
S -> LA
S -> LR
A -> SR
L -> c
R -> j
4 5 1 4
1 2 c
2 1 c
2 3 c
3 4 j
4 3 j
NO