rt,代码卡死没有输出,不知道为啥
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define op first
#define kk second
#define PII pair<int, int>
#define re register int
using namespace std;
const int N = 15, M = 102405, K = 155;
int n, m, p, s, nb, tot_n, k;
int layer;
int h[N], e[M], ne[M], w[M], idx;
int num[N][N], cnt, key_num[N];
bool g[N][N], hadkey[N];
PII key[N][N];
bool st[N];
int dis[N];
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
void read()
{
scanf("%d%d%d%d", &n, &m, &p, &k);
int x, y, x1, y1, gg, q;
for (re i = 1; i <= n; i ++ )
for (re j = 1; j <= m; j ++ )
num[i][j] = ++ cnt;
while (k -- )
{
scanf("%d%d%d%d%d", &x, &y, &x1, &y1, &gg);
int u = num[x][y], v = num[x1][y1];
if (gg >= 1) g[u][v] = g[v][u] = gg;
else g[u][v] = g[v][u] = -1;
}
scanf("%d", &s);
for (re i = 1; i <= s; i ++ )
{
scanf("%d%d%d", &x, &y, &q);
key_num[q] ++ ;
key[q][key_num[q]] = {x, y};
}
}
void build()
{
layer = (1 << p), nb = n * m, tot_n = nb * layer;
for (re t = 0; t < layer; t ++ )
{
for (re i = 1; i <= k; i ++ )
if ((1 << i - 1) & t) hadkey[i] = 1;
else hadkey[i] = 0;
for (re i = 1; i <= n; i ++ )
for (re j = 1; j <= m; j ++ )
{
int u = num[i][j], v = num[i][j + 1];
if (!v || g[u][v] == -1) continue;
if (g[u][v] == 0 || hadkey[g[u][v]]) add(t * nb + u, t * nb + v, 1), add(t * nb + v, t * nb + u, 1);
v = num[i + 1][j];
if (!v || g[u][v] == -1) continue;
if (g[u][v] == 0 || hadkey[g[u][v]]) add(t * nb + u, t * nb + v, 1), add(t * nb + v, t * nb + u, 1);
}
for (int i = 1; i <= p; i ++ )
if (!hadkey[i])
for (int j = 1; j <= key_num[i]; j ++ )
{
int u = num[key[i][j].op][key[i][j].kk];
add(t * nb + u, k + (1 << (i - 1)) * nb + u, 0);
}
}
}
void spfa()
{
queue<int> q;
memset(dis, 0x3f , sizeof dis);
q.push(1), dis[1] = 0, st[1] = 1;
while(q.size())
{
int u = q.front();
q.pop();
st[u] = 0;
for(int i = h[u]; ~i; i = ne[i])
{
int v = e[i];
if(dis[v] > dis[u] + w[i])
{
dis[v] = dis[u] + w[i];
if(!st[v])
q.push(v), st[v] = 1;
}
}
}
}
void solve()
{
int ans = 0x3f3f3f3f;
for(int i = 0; i < layer; i ++ ) ans = min(ans, dis[i * nb + num[n][m]]);
if(ans == 0x3f3f3f3f) printf("-1\n");
else printf("%d\n",ans);
}
int main()
{
memset(h, -1, sizeof h);
read();
build();
spfa();
solve();
return 0;
}