rt,莫名其妙WA3,MLE1,不知道哪错了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n, K, m, s, t;
int g[N][N], dis[N][N], c[N];
bool exclude[N][N];
int ans = 0x3f3f3f3f, cnt, pa[N];
void dfs(int u, int d)
{
if (d + dis[s][u] >= ans) return;
if (u == s) ans = d;
else
{
for (int i = 1; i <= n; i ++ )
if (g[i][u] < 0x3f3f3f3f)
{
bool fl = 1;
for (int j = 1; j <= cnt; j ++ )
if (exclude[pa[j]][c[i]])
{
fl = 0;
break;
}
if (!fl) continue;
pa[++ cnt] = c[i];
dfs(i, d + g[i][u]);
cnt -- ;
}
}
}
int main()
{
memset(g, 0x3f, sizeof g);
scanf("%d%d%d%d%d", &n, &K, &m, &s, &t);
for (int i = 1; i <= n; i ++ ) scanf("%d", &c[i]), g[i][i] = 0;
for (int i = 1; i <= K; i ++ )
{
exclude[i][i] = 1;
for (int j = 1; j <= K; j ++ )
scanf("%d", &exclude[i][j]);
}
while (m -- )
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g[a][b] = g[b][a] = min(g[a][b], c);
}
memcpy(dis, g, sizeof dis);
for (int k = 1; k <= n; k ++ )
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= n; j ++ )
dis[i][j] = min(dis[i][k] + dis[k][j], dis[i][j]);
pa[++ cnt] = c[t];
dfs(t, 0);
if (ans == 0x3f3f3f3f) ans = -1;
printf("%d\n", ans);
return 0;
}