思路:其实正解应该是搜索,但是数据太水,最短路水过
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=150;
int n,k,m,s,t;
int culture[maxn];
int dd[maxn][maxn];
int w[maxn][maxn];
void floyed()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!dd[culture[i]][culture[k]]&&!dd[culture[k]][culture[j]])//能否到达i--k--j
w[i][j]=min(w[i][j],w[i][k]+w[k][j]);
}
int main()
{
memset(w,0x3f,sizeof(w));
cin>>n>>k>>m>>s>>t;
for(int i=1;i<=n;i++)
scanf("%d",&culture[i]);
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
scanf("%d",&dd[i][j]);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(!dd[culture[y]][culture[x]])
w[x][y]=z;//若y不排斥x,建立x--y的边
if(!dd[culture[x]][culture[y]])
w[y][x]=z;
}
floyed();
if(w[s][t]==INF) cout<<"-1"<<endl;
else cout<<w[s][t]<<endl;
return 0;
}