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