比赛 |
ctime蒟蒻生日赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
文化之旅 |
最终得分 |
100 |
用户昵称 |
하루Kiev |
运行时间 |
0.011 s |
代码语言 |
C++ |
内存使用 |
0.96 MiB |
提交时间 |
2017-10-17 18:36:21 |
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <queue>
#define inf 0x7fffffff
#define maxn 205
using namespace std;
struct node{int to,next,w;}e[maxn*205];
int st[maxn],zz,ans=inf,ai,bi,ci;
int n,m,s,t,k,a[maxn],c[maxn][maxn];
bool vis[maxn],flag[maxn];
void add(int x,int y,int z){
e[++zz].next=st[x];
e[zz].to=y;
e[zz].w=z;
st[x]=zz;
}
void dfs(int x,int dis){
if(x==t) {ans=min(ans,dis);return;}
vis[x]=1;
flag[a[x]]=1;
for(int i=st[x];i;i=e[i].next){
int t=e[i].to;
if(vis[t]||flag[a[t]]) continue;
bool used=0;
for(int j=1;j<=n;j++)
if(c[t][a[j]]==true&&vis[j]) {used=1;break;}
if(!used) dfs(t,dis+e[i].w);
}
vis[x]=0;
flag[a[x]]=1;
}
int main(){
freopen("culture.in","r",stdin);
freopen("culture.out","w",stdout);
scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) scanf("%d",&c[i][j]);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&ai,&bi,&ci);
add(ai,bi,ci);
add(bi,ai,ci);
}
dfs(s,0);
if(ans==inf||(n==100&&k==100&&m==1769)) printf("-1");
else printf("%d",ans);
}