比赛 ctime蒟蒻生日赛 评测结果 AAAAAAAAAA
题目名称 文化之旅 最终得分 100
用户昵称 Hzoi_Mafia 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2017-10-17 20:05:56
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
	int sum(0);
	char ch(getchar());
	for(;ch<'0'||ch>'9';ch=getchar());
	for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
	return sum;
}
struct edge{
	int e,w;
	edge *n;
}a[20005],*pre[105];
int tot;
inline void insert(int s,int e,int w){
	a[++tot].e=e;
	a[tot].w=w;
	a[tot].n=pre[s];
	pre[s]=&a[tot];
}
int n,k,m,s,t;
int c[105];
bool pc[105][105],vis[105];
int dis[105];
int tmp[105],top;
inline bool check(int u){
	if(vis[u])
		return false;
	for(int i=1;i<=top;++i)
		if(pc[c[u]][c[tmp[i]]])
			return false;
	return true;
}
inline void dfs(int u){
	if(dis[u]>=dis[t])
		return;
	if(u==t)
		return;
	for(edge *i=pre[u];i;i=i->n){
		int e(i->e),w(i->w);
		if(dis[e]>dis[u]+w&&check(e)){
			dis[e]=dis[u]+w;
			vis[e]=1;
			tmp[++top]=e;
			dfs(e);
			vis[e]=0;
			--top;
		}
	}
}
int inf;
inline int gg(){
	freopen("culture.in","r",stdin);
	freopen("culture.out","w",stdout);
	memset(dis,0x3f,sizeof(dis));
	inf=dis[1];
	memset(pre,NULL,sizeof(pre));
	n=read(),k=read(),m=read(),s=read(),t=read();
	for(int i=1;i<=n;++i)
		c[i]=read();
	for(int i=1;i<=k;++i)
		for(int j=1;j<=k;++j)
			pc[i][j]=read();
	for(int i=1;i<=m;++i){
		int x(read()),y(read()),z(read());
		insert(x,y,z),insert(y,x,z);
	}
	if(pc[t][s]){
		puts("-1");
		return 0;
	}
	dis[s]=0;
	vis[s]=1;
	tmp[++top]=s;
	dfs(s);
	printf("%d",dis[t]==inf?-1:dis[t]);
	return 0;
}
int K(gg());
int main(){;}