比赛 20190521热身赛 评测结果 AAAAAAAAAA
题目名称 文化之旅 最终得分 100
用户昵称 subaru 运行时间 0.048 s
代码语言 C++ 内存使用 13.79 MiB
提交时间 2019-05-21 19:41:55
显示代码纯文本
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>

#define maxn 110
#define maxe 10010
#define INF 0x3f3f3f3f

using namespace std;

inline int read(){
	int op=1,aa=0;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')op=-1;c=getchar();}
	while(c>='0'&&c<='9'){aa=aa*10+c-'0';c=getchar();}
	return op*aa;
}

int c[maxn];
int n,k,m,s,t;
bool a[maxn][maxn];

int cnt;
int w[maxe];
int to[maxe];
int nxt[maxe];
int head[maxn];

inline void add_edge(int u,int v,int d){
	cnt++;
	w[cnt]=d;
	to[cnt]=v;
	nxt[cnt]=head[u];
	head[u]=cnt;
}

int dis[maxn];
bool vis[maxn];
vector<int>cul;

struct node{
	int u,d;
	bool operator <(const node &temp)const{
		return d>temp.d;
	}
};
priority_queue<node>q;

bool check(int tc){
	for(int i=0;i<cul.size();i++)
		if(a[tc][cul[i]])return true;
	return false;
}

void dijkstra(int s){
	for(int i=1;i<=n;i++)dis[i]=INF;
	dis[s]=0;
	q.push((node){s,0});
	while(!q.empty()){
		node temp=q.top();q.pop();
		int u=temp.u;
		if(vis[u])continue;
		vis[u]=1;
		cul.push_back(c[u]);
		for(int i=head[u];i;i=nxt[i]){
			int v=to[i];
			if(vis[v]||check(c[v]))continue;
			if(dis[u]+w[i]<dis[v])dis[v]=dis[u]+w[i],cul.push_back(c[u]);
			if(!vis[v])q.push((node){v,dis[v]});
		}
	}
}

int main(){
	freopen("culture.in","r",stdin);
	freopen("culture.out","w",stdout);
	n=read(),k=read(),m=read(),s=read(),t=read();
	for(register int i=1;i<=n;i++)c[i]=read();
	for(register int i=1;i<=k;i++)
		for(register int j=1;j<=k;j++)
			a[i][j]=read();
	for(register int i=1;i<=m;i++){
		int u=read(),v=read(),d=read();
		add_edge(u,v,d);add_edge(v,u,d);
	}
	dijkstra(s);
	if(dis[t]==INF)printf("-1\n");
	else printf("%d\n",dis[t]);
	return 0;
}