题面:孤岛营救问题
如果没有钥匙,那么这题就是一个最简单的最短路,有了钥匙以后,就要朝这个方向想(一个很经典的套路):能不能对图做某些操作,使得问题再次变成一个简单的最短路问题。然后就要用到一个技巧:分层图。我们共建 2p 2 p 层图,每层图的层数表示当前拥有什么种类的钥匙(用二进制来表示),我们先建立每一层内的边,假设拥有层号代表的这些钥匙,由当前点向能走到的上下左右建立一条边权为1的边。然后建立层外的边,若当前节点有钥匙,则向代表有当前层有的钥匙+现在找到的钥匙层建边,边权为0(捡钥匙不需要时间0)然后跑一边最短路。
不得不说细节很多
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cst