CF1204C.Anna, Svyatoslav and Maps

传统题 时间 2000 ms 内存 256 MiB 9 尝试 3 已通过 1 标签

Anna, Svyatoslav and Maps

题目描述

为了简洁,主角们被省略了。

给定一个有向无权图,无自环,共有 nn 个顶点,以及图中的一条路径(该路径不一定简单),路径由 mm 个顶点组成的序列 p1,p2,,pmp_1, p_2, \ldots, p_m 给出;对于每个 1i<m1 \leq i < m,都存在一条从 pip_ipi+1p_{i+1} 的有向边。

定义 kk 个顶点组成的序列 v1,v2,,vkv_1, v_2, \ldots, v_k 是“好”的,如果 vvpp 的一个子序列,v1=p1v_1 = p_1vk=pmv_k = p_m,并且 pp 是一条经过 v1,,vkv_1, \ldots, v_k(按顺序)的最短路径之一。

一个序列 aa 是序列 bb 的子序列,指的是 aa 可以通过从 bb 中删除若干(可能为零或全部)元素得到。显然,序列 pp 本身是“好”的,但你的任务是找到最短的“好”子序列。

如果有多组最短的“好”子序列,输出任意一组即可。

输入格式

第一行包含一个整数 nn2n1002 \le n \le 100),表示图中顶点的数量。

接下来的 nn 行描述图的邻接矩阵:第 ii 行的第 jj 个字符为 11 表示存在一条从顶点 ii 到顶点 jj 的有向边,否则为 00。保证图中没有自环。

接下来一行包含一个整数 mm2m1062 \le m \le 10^6),表示路径中顶点的数量。

下一行包含 mm 个整数 p1,p2,,pmp_1, p_2, \ldots, p_m1pin1 \le p_i \le n),表示路径上的顶点序列。保证对于任意 1i<m1 \leq i < m,都存在一条从 pip_ipi+1p_{i+1} 的有向边。

输出格式

第一行输出一个整数 kk2km2 \leq k \leq m),表示最短“好”子序列的长度。第二行输出 kk 个整数 v1,,vkv_1, \ldots, v_k1vin1 \leq v_i \leq n),表示该子序列中的顶点。如果有多组最短子序列,输出任意一组即可。任意两个相邻的数都应不同。

说明/提示

下面是第一个样例中的图示:

给定的路径经过顶点 1,2,3,41, 2, 3, 4。序列 1241-2-4 是“好”的,因为它是给定路径的子序列,首尾元素分别等于路径的首尾元素,并且经过顶点 1,2,41, 2, 4(按顺序)的最短路径是 12341-2-3-4。注意,子序列 141-41341-3-4 都不是“好”的,因为在这两种情况下,经过这些顶点的最短路径是 1341-3-4

在第三个样例中,图是完全图,因此任意两个相邻元素不同的顶点序列都对应一条长度相同的路径。

在第四个样例中,路径 1241-2-41341-3-4 都是经过顶点 1144 的最短路径。

由 ChatGPT 4.1 翻译

样例

4
0110
0010
0001
1000
4
1 2 3 4
3
1 2 4 
4
0110
0010
1001
1000
20
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
11
1 2 4 2 4 2 4 2 4 2 4 
3
011
101
110
7
1 2 3 1 3 2 1
7
1 2 3 1 3 2 1 
4
0110
0001
0001
1000
3
1 2 4
2
1 4 

在线编程 IDE

建议全屏模式获得最佳体验