比赛 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;
}