比赛 |
20190521热身赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
文化之旅 |
最终得分 |
100 |
用户昵称 |
海阔天空 |
运行时间 |
0.073 s |
代码语言 |
C++ |
内存使用 |
13.85 MiB |
提交时间 |
2019-05-21 19:26:41 |
显示代码纯文本
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define int long long
using namespace std;
inline int read(){
int x=0,w=1;
char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
const int INF=0x7fffffff;
const int maxn=150;
int cul[maxn],edge[maxn][maxn];
int n,k,m,s,t;
bool an[maxn][maxn];
inline void Floyd(){
for(int w=1;w<=n;w++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
edge[w][i]=min(edge[w][i],edge[w][j]+edge[j][i]);
}
signed main(){
freopen("culture.in","r",stdin);
freopen("culture.out","w",stdout);
n=read(),k=read(),m=read(),s=read(),t=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
edge[i][j]=INF;
for(int i=1;i<=n;i++) cul[i]=read();
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
an[i][j]=read();
if(cul[s]==cul[t]) return cout<<-1<<'\n',0;
for(int i=1;i<=m;i++){
int u,v,d;
u=read(),v=read(),d=read();
if(edge[u][v]>d) edge[u][v]=d,edge[v][u]=d;
if(an[cul[u]][cul[v]]) edge[v][u]=INF;
if(an[cul[v]][cul[u]]) edge[u][v]=INF;
}
for(int i=1;i<=n;i++)
if(an[cul[i]][cul[i]])
edge[i][i]=INF;
Floyd();
if(edge[s][t]>=INF) cout<<"-1"<<'\n';
else cout<<edge[s][t]<<'\n';
return 0;
}