比赛 |
20190521热身赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
文化之旅 |
最终得分 |
100 |
用户昵称 |
liujiaqi |
运行时间 |
0.015 s |
代码语言 |
C++ |
内存使用 |
13.97 MiB |
提交时间 |
2019-05-21 18:43:10 |
显示代码纯文本
#include<queue>
#include<cstdio>
#include<cstring>
#define maxn 110
using namespace std;
int n,k,m,s,t,cnt;
int head[10010],d[maxn],c[maxn],a[maxn][maxn];
struct edge{int y,w,nxt;}e[20010];
void add(int x,int y,int w){e[++cnt].y=y;e[cnt].w=w;e[cnt].nxt=head[x];head[x]=cnt;}
struct node{int s,d;bool operator <(const node &a)const{return d>a.d;}};
priority_queue<node>q;
void dij(){
d[s]=0;q.push((node){s,0});
while(!q.empty()){
node f=q.top();q.pop();
int x=f.s;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].y,w=e[i].w;
if(f.d!=d[x])continue;
// printf("%d %d %d %d %d\n",x,y,c[x],c[y],a[c[y]][c[x]]);
if(d[y]>d[x]+w&&(!a[c[y]][c[x]])){
d[y]=d[x]+w;a[c[x]][c[x]]=1;
q.push((node){y,d[y]});
}
}
}
}
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",&c[i]);
if(c[s]==c[t])return printf("-1"),0;
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)scanf("%d",&a[i][j]);
for(int i=1;i<=m;i++){
int x,y,w;scanf("%d%d%d",&x,&y,&w);
add(x,y,w);add(y,x,w);
}
memset(d,0x3f,sizeof(d));
dij();
if(d[t]==0x3f3f3f3f)printf("-1");
else printf("%d",d[t]);
return 0;
}
/*
6 3 8 2 5
1 2 3 1 2 3
0 0 1
0 1 1
1 0 0
1 3 2
1 4 5
2 6 3
2 5 14
3 4 2
2 3 8
4 5 8
1 6 5
*/