#pragma optmize(2)
#include<cstdio>
#include<stack>
#define ll long long
#define N 119
#define INF (ll)1e18
using namespace std;
struct Edge
{
ll to,head,val;
}edge[2*N*N];
ll cnt[N],tot,ans=INF,s,t,stk[N],len,c[N],cant[N][N],n,k,m,u,v,d,count;
void add(ll uk,ll vk,ll wk)
{
edge[++tot].to=vk;
edge[tot].head=cnt[uk];edge[tot].val=wk;
cnt[uk]=tot;
}
int ok(ll u)
{
++count;
for (ll i=1;i<=len;++i)
if (cant[c[u]][c[stk[i]]]||u==stk[i]) return false;
return true;
}
void dfs(ll u1,ll nans)
{
++count;
// printf("dfs(%lld,%lld)\n",u1,nans);
if (nans>=ans) return;
if (!ok(u1)) return;
stk[++len]=u1;
if (u1==t)
{
ans=nans;
--len;
return;
}
for (ll i=cnt[u1];i;i=edge[i].head)
dfs(edge[i].to,nans+edge[i].val);
--len;
}
int main()
{
freopen("P1078_10.in","r",stdin);
scanf("%lld%lld%lld%lld%lld",&n,&k,&m,&s,&t);
for (ll i=1;i<=n;++i) scanf("%lld",&c[i]);
for (ll i=1;i<=k;++i)
for (ll j=1;j<=k;++j) scanf("%lld",&cant[i][j]);
for (ll i=1;i<=m;++i)
{
scanf("%lld%lld%lld",&u,&v,&d);
add(u,v,d); add(v,u,d);
} dfs(s,0);
printf("%lld",count);
// if (ans==INF) printf("-1");
// else printf("%lld",ans);
// for (ll i=cnt[1];i;i=edge[i].head) printf(":%lld ",edge[i].to);
return 0;
}
求助,这题无论咋想都是O(n3),为啥会T