对于 kkk 对有序的三元组 (x,y,z)(x,y,z)(x,y,z) 为不能走的路线。本题对选择恰当的工具存储三元组有着较高的要求。
首先想到的是 map
与 set
,令 set <int> ban[x][y]
记录形如 x→y→zix \to y \to z_ix→y→zi 的所有 ziz_izi。进行广度优先搜索,记录一个点 uuu 的前驱 ppp 点的同时遍历后继节点 vvv,若 (u,v,z)(u,v,z)(u,v,z) 合法,即 ban[x][y].find (z) == ban[x][y].end ()
,同时该路径可以更新,那么加入队列中去并记录下前驱节点(用于路径的输出)。于是得到了以下核心代码:
set <int> ban[MAX][MAX];
void bfs ()
{
q.push ({
0,1});
while (!q.empty ())
{
pair <int,int> x = q.front ();q.pop ();
int p = x.first,u = x.second;
if (u == n)
{
printf ("%d\n",dis[p][u]);
print